如何在pandas中使用read_csv读取时区感知日期时间作为时区天真本地DatetimeIndex?

Pug*_*gie 5 python datetime pandas

当我使用 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)
Run Code Online (Sandbox Code Playgroud)

这会产生一个表示时区天真的 UTC 时间的索引:

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)
Run Code Online (Sandbox Code Playgroud)

我尝试使用 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)
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果。

如何让 read_csv 创建一个 DatetimeIndex ,它是时区天真并代表本地时间而不是UTC 时间

我正在使用熊猫 0.18.1。

Pug*_*gie 4

Alex 的答案导致了一个时区感知的 DatetimeIndex。要按照 OP 的要求获取时区原生本地dateutil.parser.parserDatetimeIndex,请通过设置通知忽略时区信息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)
Run Code Online (Sandbox Code Playgroud)

输出

                     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
Run Code Online (Sandbox Code Playgroud)