#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)
Комментариев нет:
Отправить комментарий