Как читать временные интервалы времени в качестве часового пояса наивного локального DatetimeIndex с read_csv в пандах?
Когда я использую pandas read_csv для чтения столбца с указанием времени и времени, указанного в часовом поясе (и указывать этот столбец как индекс), pandas преобразует его в наименьший часовой пояс utc DatetimeIndex.
Данные в Test.csv:
DateTime,Temperature 2016-07-01T11:05:07+02:00,21.125 2016-07-01T11:05:09+02:00,21.138 2016-07-01T11:05:10+02:00,21.156 2016-07-01T11:05:11+02:00,21.179 2016-07-01T11:05:12+02:00,21.198 2016-07-01T11:05:13+02:00,21.206 2016-07-01T11:05:14+02:00,21.225 2016-07-01T11:05:15+02:00,21.233
Код для чтения из csv:
In [1]: import pandas as pd In [2]: df = pd.read_csv('Test.csv', index_col=0, parse_dates=True)
Это приводит к индексу, представляющему наивное время часового пояса часового пояса:
In [3]: df.index Out[3]: DatetimeIndex(['2016-07-01 09:05:07', '2016-07-01 09:05:09', '2016-07-01 09:05:10', '2016-07-01 09:05:11', '2016-07-01 09:05:12', '2016-07-01 09:05:13', '2016-07-01 09:05:14', '2016-07-01 09:05:15'], dtype='datetime64[ns]', name='DateTime', freq=None)
Я попытался использовать функцию date_parser:
In [4]: date_parser = lambda x: pd.to_datetime(x).tz_localize(None) In [5]: df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser)
Это дало тот же результат.
Как я могу заставить read_csv создать DatetimeIndex, который является наименее часовым, и представляет собой локальное время вместо времени utc ?
Я использую панды 0.18.1.
- Панды: добавление различного количества дней к дате в фрейме данных
- Python: форматирование даты, времени
- Python-postgresql временная метка и время без часового пояса
- Python: преобразовать dateelta в int значение разницы во времени
- Создание массива дат в python
Согласно документам, date_parser
по умолчанию использует dateutil.parser.parser
. Согласно документам для этой функции , по умолчанию следует игнорировать временные интервалы. Поэтому, если вы dateutil.parser.parser
как date_parser
kwarg, временные интервалы не преобразуются.
import dateutil df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=dateutil.parser.parse) print(df)
выходы
Temperature DateTime 2016-07-01 11:05:07+02:00 21.125 2016-07-01 11:05:09+02:00 21.138 2016-07-01 11:05:10+02:00 21.156 2016-07-01 11:05:11+02:00 21.179 2016-07-01 11:05:12+02:00 21.198 2016-07-01 11:05:13+02:00 21.206 2016-07-01 11:05:14+02:00 21.225 2016-07-01 11:05:15+02:00 21.233
Ответ Alex приводит к тому, что DatetimeIndex знает о часовом поясе. Чтобы получить наименьшее временное зонирование локального DatetimeIndex, по dateutil.parser.parser
OP, сообщите dateutil.parser.parser
чтобы игнорировать информацию о часовом поясе, установив ignoretz=True
:
import dateutil date_parser = lambda x: dateutil.parser.parse(x, ignoretz=True) df = pd.read_csv('Test.csv', index_col=0, parse_dates=True, date_parser=date_parser) print(df)
выходы
Temperature DateTime 2016-07-01 11:05:07 21.125 2016-07-01 11:05:09 21.138 2016-07-01 11:05:10 21.156 2016-07-01 11:05:11 21.179 2016-07-01 11:05:12 21.198 2016-07-01 11:05:13 21.206 2016-07-01 11:05:14 21.225 2016-07-01 11:05:15 21.233
dateutil
я принял технологию dateutil
, но с тех пор перешел на более быструю альтернативу:
date_parser = lambda ts: pd.to_datetime([s[:-5] for s in ts]))
Изменить:
s[:-5]
правильно (снимок экрана имеет ошибку)
На скриншоте ниже я импортирую ~ 55 МБ разделенных табуляцией файлов. Метод dateutil
работает, но на порядки больше.
Это использовалось pandas 0.18.1 и dateutil 2.5.3.
- Как найти самое близкое совпадение на основе 2 ключей от одного блока данных к другому?
- Функция прогнозирования вызовов для классификатора ближайшего соседа (knn) с Python scikit sklearn
- python pandas извлекает уникальные даты из временных рядов
- pd.read_csv неправильно обрабатывает поле даты / месяца при установке parse_date =
- Преобразование полей даты и времени в хронологическом файле Chrome (sqlite) в читаемый формат
- python – как найти datetime 10 минут после текущего времени?
- pytz.timezone показывает странные результаты для Азии / Калькутты?
- Добавление секунд в datetime
- Datetime Unix timestamp содержит миллисекунды
- Сравнение объекта datetime с строками 8601 дает неверный результат, почему это разрешено?
- pandas dataframe: дубликаты на основе столбца и временного диапазона