Как читать временные интервалы времени в качестве часового пояса наивного локального 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.

Согласно документам, 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.