为什么在熊猫中转换时区(并转换为unix时间戳)的行为不一致?

时间:2019-01-15 07:31:46

标签: python pandas datetime timestamp

我正在解析和处理一些日期和时间,出于与其他系统互操作性的考虑,这些日期和时间也需要存储为UNIX(纪元)时间戳。这样做的时候,我从熊猫的Timestamp.tz_convert()中看到了一些奇怪的行为,然后在转换为时代时间的过程中看到了它的Timestamp.strftime()行为,这使我怀疑我应该怎么做。 / p>

我的工作时间是在美国/东部时区,但是当然,纪元时间是UTC,所以我的方法一直是 cast 到UTC,因为大多数到UNIX的转换时间戳假定以tz天真的DateTime为UTC。让我们撇开是否必须绝对进行这种转换才能获得有效的时间戳;这是我看到的问题: 1.使用Timestamp.tz_convert()更改时间戳的时区表示形式(即通用时间点),当您使用Timestamp.strftime()进行转换时, 也会更改UNIX时间戳。 2.这些时间戳记之间的差异甚至与美国东部时间与格林尼治标准时间之间的适当时差不符。

以下是一些基本的交互模式python来说明:

>>> import pytz
>>> from pytz import timezone
>>> import pandas as pd
>>> dtest = pd.to_datetime("Sunday, July 28, 2018 10:00 AM", infer_datetime_format=True).replace(tzinfo=timezone('America/New_York')) # okay, this should uniquely represent a point in time
>>> dtest
Timestamp('2018-07-28 10:00:00-0400', tz='America/New_York') # yup, that's the time - 10AM at GMT-0400.
>>> dtest2 = dtest.tz_convert('UTC') # convert to UTC
>>> dtest2
Timestamp('2018-07-28 14:00:00+0000', tz='UTC') # yup, same point in time, just different time zone now
>>> dtest.strftime('%s') # let's convert to unix time - this looks right
'1532786400'
>>> dtest2.strftime('%s') # should be the same, but it's not. WTF?
'1532804400'

时间戳看起来就像是在描述事情:一个是GMT-0400的10 AM,另一个是GMT + 0000的2 PM,与预期的相差4个小时。当然,它们都是时区感知的。但是随后将它们转换为UNIX时间戳会产生
(A)数字不同,甚至更糟,
(B)数字相差5小时(18000秒= 5 * 60 * 60)而不是4,所以我什至不能假设strftime()只是忽略时区。

在我进行健全性检查时,我正在使用https://www.epochconverter.com/来验证所有时间戳,因此有可能被误导。但是根据那个网站,
1532786400 = 2018-07-28T10:00 -0400,
1532804400(最后一个结果)= 2018-07-28T15:00 -0400,即格林尼治标准时间晚上7点,相差5个小时。

关于从UNIX时间戳转换大熊猫时间戳的问题有很多,但是对于转换到时代时间的问题却很少。我可以想到2种可能的解释:
(1)tz_convert()正在我的系统上提取一些环境变量,说我是GMT -0500,并在转换过程中使用了该变量,尽管这与在时区感知的时间戳之间进行转换无关,并且这样做实际上正在改变表示的基本时间点。或:
(2)Timestamp.strftime()错误,要么忽略了感知tz的时间戳的时区参数,要么在要求输入'%s'格式参数时做一些奇怪的事情。

非常感谢所有建议。

0 个答案:

没有答案