【发布时间】:2019-12-03 20:54:00
【问题描述】:
在我的 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 是在格林威治标准时间 (GMT) 基础上增加 1 小时的时间偏移量。
因此,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 我得到了这个:
上述“Etc/GMT*”时区提供固定偏移量 规格,但要注意违反直觉的标志 约定。
所以,看起来他们以反直觉的方式对待歌曲。看起来我找到了解决方案,但现在我不确定应该如何在我的 CSV 中处理“GMT+0100”(它与 Python 无关),它只是从网站下载的。 GMT+0100 的含义是否有标准约定?
【问题讨论】:
-
我不知道答案,但调试的第一步是尝试dateutil.parser,因为Pandas documentation 表示这是默认的日期时间解析器。您可以查看错误是在那里还是其他地方。
-
它看起来将您传递的时间视为 UTC,然后将其转换为 GMT+01。多么奇怪的行为。
标签: python pandas datetime timezone