从CSV文件读取时,大熊猫如何处理时区?

Rom*_*man 5 python timezone datetime pandas

在我的CSV文件中,我具有以下条目:

Local time,Open,High,Low,Close,Volume
01.01.2015 00:00:00.000 GMT+0100,1.20976,1.20976,1.20976,1.20976,0
01.01.2015 00:01:00.000 GMT+0100,1.20976,1.20976,1.20976,1.20976,0
01.01.2015 00:02:00.000 GMT+0100,1.20976,1.20976,1.20976,1.20976,0
01.01.2015 00:03:00.000 GMT+0100,1.20976,1.20976,1.20976,1.20976,0
Run Code Online (Sandbox Code Playgroud)

第一列包含特定时区(GMT+01)中的日期时间。

我使用以下命令读取了CSV文件:

df = pd.read_csv(csv, sep = ',', parse_dates = ['Local time'])
Run Code Online (Sandbox Code Playgroud)

结果,我得到以下信息:

0   2015-01-01 01:00:00 1.20976 1.20976 1.20976 1.20976 0.0
1   2015-01-01 01:01:00 1.20976 1.20976 1.20976 1.20976 0.0
2   2015-01-01 01:02:00 1.20976 1.20976 1.20976 1.20976 0.0
3   2015-01-01 01:03:00 1.20976 1.20976 1.20976 1.20976 0.0
4   2015-01-01 01:04:00 1.20976 1.20976 1.20976 1.20976 0.0
Run Code Online (Sandbox Code Playgroud)

如我们所见,时间戳已修改(已添加一个小时)。我的解释是时间已转换为时UTC区。不过,我不确定,因为据Google称:

GMT + 01是一个格林尼治标准时间(GMT)加1小时的时间偏移。

因此,中的时间GMT+01应比中的大1小时UTC。因此,UTC应该早一小时。因此,00:00应该成为23:00而非01:00

我在哪里解释错误?

添加

我玩过熊猫to_datetime功能。看起来这是上述行为的原因。

如果我将其应用于与CSV格式相同的时间:

pd.to_datetime('01.01.2015 00:00:00.000 GMT+0100')
Run Code Online (Sandbox Code Playgroud)

然后我得到相同的结果:

Timestamp('2015-01-01 01:00:00')
Run Code Online (Sandbox Code Playgroud)

因此,如您所见,添加了1小时(与之前一样)。

但是,如果我将其应用于经过修改的格式(我认为相同):

pd.to_datetime('01.01.2015 00:00:00.000+01:00')
Run Code Online (Sandbox Code Playgroud)

然后我得到另一个结果:

Timestamp('2014-12-31 23:00:00')
Run Code Online (Sandbox Code Playgroud)

总结一下,GMT+0100+01:00区别对待。这是为什么?我会误解吗?

加了2

因此,它似乎与python如何处理时区有关。如果执行此命令:

pd.to_datetime('01.01.2015 00:00:00.000').tz_localize('Etc/GMT+5').tz_convert('GMT')
Run Code Online (Sandbox Code Playgroud)

我得到这个:

Timestamp('2015-01-01 05:00:00+0000', tz='GMT')
Run Code Online (Sandbox Code Playgroud)

我希望在GMT+5时区,时间比中的时间大5个小时GMT。所以,GMT+5应该在以后。但是,看起来情况恰恰相反。但为什么?

当我在以下站点上玩游戏时:https : //time.is/GMT+5,我确实看到GMT + 5比GMT多了5个小时。

加3

时区文档中我得到了:

上面提到的“ Etc / GMT *”时区提供了固定的偏移量规范,但请注意违反直觉的符号约定。

因此,看起来他们对直觉的反感对待。看来我已经找到了解决方案,但是现在我不确定应如何在CSV中处理“ GMT + 0100”(与Python无关),它只是从网站上下载的。有什么标准约定GMT+0100吗?

Cod*_*ent 1

pandas 依赖于您的计算机区域设置和一些启发式方法。如果日期时间看起来很奇怪,请指定确切的格式。

df = pd.read_csv(csv)
pd.to_datetime(df['Local time'], format='%d.%m.%Y %H:%M:%S.%f GMT%z')

0   2015-01-01 00:00:00+01:00
1   2015-01-01 00:01:00+01:00
2   2015-01-01 00:02:00+01:00
3   2015-01-01 00:03:00+01:00
Name: Local time, dtype: datetime64[ns, pytz.FixedOffset(60)]
Run Code Online (Sandbox Code Playgroud)

许多函数不适用于时区感知的日期时间,因此您可能希望将所有内容转换为单个时区,然后完全删除时区:

pd.to_datetime(df['Local time'], format='%d.%m.%Y %H:%M:%S.%f GMT%z') \
    .dt.tz_convert('America/New_York') \
    .dt.tz_localize(None)
Run Code Online (Sandbox Code Playgroud)