Страницы

Поиск по вопросам

суббота, 11 января 2020 г.

Неправильное отображение даты и времени в Plotly

#python #excel #pandas #dataframe #plotly


Редактирую чужой код.
Input: Множество xlsx-файлов с несколькими полями, одно из которых временное в формате
ДД-ММ-ГГГГ чч:мм:сс. Иногда после секунд бывают непонятные остатки. 



Имеющийся код на основе библиотеки Plotly состоит из множества самописных и вложенных
друг в друга функций, он читает xlsx-файл, и создает отчет с несколькими интерактивными
графиками множества параметров от времени в HTML-формате. 

Кода много, поэтому вопрос абстрактный: почему половина однородных с виду xlsx-файлов
обрабатывается корректно:



, а половина со странными числами, похожими на те, которые получаются, если в Excel
дату и время обратить в десятичный формат:



Пробовал вручную определять форматы временного поля, и как Общий, и как Текст, и
Время и Дата, но не помогает. 

Подскажите идею?
    


Ответы

Ответ 1



После некоторых проб и ошибок пришел к такому варианту: import datetime as dt def get_excel_date(col): res = pd.to_datetime(col, errors='coerce') mask = res.isna() res.loc[mask] = pd.to_timedelta(col[mask].astype('float'), unit='d') + dt.datetime(1899, 12, 30) return res df = pd.read_excel(r"D:\download\Sample.xlsx") df['Date'] = get_excel_date(df['Время']) In [53]: df[['Время','Date']] Out[53]: Время Date 0 2018-10-31 23:44:59.996000 2018-10-31 23:44:59.996000000 1 2018-11-01 00:00:00 2018-11-01 00:00:00.000000000 2 2018-11-01 00:04:34.999000 2018-11-01 00:04:34.999000000 3 2018-11-01 00:15:00 2018-11-01 00:15:00.000000000 4 2018-11-01 00:25:19.999000 2018-11-01 00:25:19.999000000 5 2018-11-01 00:29:59.996000 2018-11-01 00:29:59.996000000 6 2018-11-01 00:44:54.996000 2018-11-01 00:44:54.996000000 ... ... ... 20909 43511.65497684028 2019-02-15 15:43:09.998976000 20910 43511.65625 2019-02-15 15:45:00.000000000 20911 43511.657638888886 2019-02-15 15:47:00.000009600 20912 43511.666666666664 2019-02-15 16:00:00.000028800 20913 43511.67708328704 2019-02-15 16:14:59.995996800 20914 43511.67988425926 2019-02-15 16:19:01.999977600 20915 43511.6875 2019-02-15 16:30:00.000000000 [20916 rows x 2 columns]

Ответ 2



Очевидно, что в некоторых Excel файлах время сохранено с миллисекундами. Возможно, некая ошибка округления, так как 999 миллисекунд выглядят очень подозрительно. Прямо в Excel можно нормализовать данные таким образом: = ROUND(A1*24*60*60,0)/(24*60*60) Или = ОКРУГЛ(A1*24*60*60,0)/(24*60*60) Пример: Если значение записано в виде текста, как в примере файла, добавленном автором вопроса, то его предварительно нужно преобразовать в числовой формат: = DATEVALUE(A1)+TIMEVALUE(A1) = ДАТАЗНАЧ(A1)+ВРЕМЗНАЧ(A1)

Комментариев нет:

Отправить комментарий