for
输出:
tz = pytz.timezone('America/Los_Angeles')
t1 = pd.Timestamp(datetime.datetime(2019, 2, 6, 17, 0, 0, tzinfo=tz))
t1
为什么要选择-0753?
更新: 经过研究,这种方式似乎可行: 我可能做不到正确的方法,请参见下文
Timestamp('2019-02-06 17:00:00-0753', tz='America/Los_Angeles')
输出:
tz = pytz.timezone('America/Los_Angeles')
t1 = datetime.datetime(2019, 2, 6, 17, 0, 0)
t1 = tz.localize(t1)
t1 = pd.Timestamp(t1)
t1
然后将Timestamp('2019-02-06 17:00:00-0800', tz='America/Los_Angeles')
传递给tzinfo
是什么样的对象?
答案 0 :(得分:1)
我不知道为什么,但是这个奇怪的时区偏移来自pytz。参见下面的代码:
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Los_Angeles')))
2019-05-10 00:00:00-07:53
>>>print(pytz.timezone('America/Los_Angeles').localize(datetime(2019, 5, 10)))
2019-05-10 00:00:00-07:00
因此,如果您尝试创建日期时间并提供tzinfo
,它将创建此偏移量。
更新。
我检查了pytz docs并找到了下一个:
不幸的是,在许多时区中,使用标准日期时间构造函数的tzinfo参数“不起作用”与pytz一起使用。
...
它对于没有夏令时转换的时区是安全的,例如UTC。
好吧,他们告诉了我,但没有指出原因。让我们尝试找到它。在pytz来源中,我发现它们使用的IANA database版本:
OLSON_VERSION = '2019a'
在将该数据库下载并解压缩为文件“ northamerica”后,我接下来找到了:
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02
-8:00 US P%sT 1946
-8:00 CA P%sT 1967
-8:00 US P%sT
-7:52:58
非常接近我们拥有的-07:53
。
结论:pytz中的某个地方包含一个数据库,其中包含所有已知的时区偏移量。当我们将tzinfo传递到datetime的构造函数中时,它会获得第一个已知的时区,并在本地化方法中使用它,该方法调用replace()并传递tzinfo,以某种方式获得正确的时区偏移。
要进行检查,我在另一个时区的同一文件中找到了
# Zone NAME GMTOFF RULES FORMAT [UNTIL]
Zone America/Toronto -5:17:32 - LMT 1895
-5:00 Canada E%sT 1919
-5:00 Toronto E%sT 1942 Feb 9 2:00s
-5:00 Canada E%sT 1946
-5:00 Toronto E%sT 1974
-5:00 Canada E%sT
然后我启动了下一个代码:
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone('America/Toronto')))
2019-05-10 00:00:00-05:18
如您所见,结果是相同的。它使用了-5:17:32
,它是列表的第一个偏移量。