在我的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
第一列包含特定时区(
GMT+01
)中的日期时间。我使用以下命令读取了CSV文件:
df = pd.read_csv(csv, sep = ',', parse_dates = ['Local time'])
结果,我得到以下信息:
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
如我们所见,时间戳已被修改(已添加一个小时)。我的解释是时间已转换为
UTC
时区。但是,我不确定,因为据Google称:因此,
GMT+01
中的时间应该比UTC
中的时间长1小时。因此,在UTC
中应该早一小时。因此,00:00
应该变成23:00
而不是01:00
。我在哪里解释错误?
已添加
我玩了 Pandas
to_datetime
函数。看起来这是上述行为的原因。如果我将其应用于与CSV格式相同的时间:
pd.to_datetime('01.01.2015 00:00:00.000 GMT+0100')
然后我得到相同的结果:
Timestamp('2015-01-01 01:00:00')
因此,如您所见,添加了1小时(与之前一样)。
但是,如果我将其应用于经过修改的格式(我认为是相同的):
pd.to_datetime('01.01.2015 00:00:00.000+01:00')
然后我得到另一个结果:
Timestamp('2014-12-31 23:00:00')
总而言之,
GMT+0100
和+01:00
被不同地对待。这是为什么?我会误解吗?已添加2
因此,它似乎与python如何处理时区有关。如果执行此命令:
pd.to_datetime('01.01.2015 00:00:00.000').tz_localize('Etc/GMT+5').tz_convert('GMT')
我得到这个:
Timestamp('2015-01-01 05:00:00+0000', tz='GMT')
我希望在
GMT+5
时区中,时间比在GMT
中大5小时。因此,在GMT+5
中应该晚一些。但是,看起来情况恰恰相反。但为什么?当我玩这个网站:https://time.is/GMT+5时,我确实看到GMT + 5比GMT多了5个小时。
已添加3
从documentation on the timezones我得到了:
因此,看起来他们对直觉的反感对待。看起来我已经找到了解决方案,但是现在我不确定应如何在CSV中处理“GMT + 0100”(与Python无关),它只是从网站上下载的。是否有关于
GMT+0100
含义的标准约定? 最佳答案
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)]
许多功能不适用于支持时区的日期时间,因此您可能希望将所有内容都转换为一个时区,然后将其完全删除:
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)
关于python - 从CSV文件读取时, Pandas 如何处理时区?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57204320/