-753 就“pd.Timestamp”中的时区而言意味着什么

zyx*_*xue 3 python timestamp pandas

tz = pytz.timezone('America/Los_Angeles')
t1 = pd.Timestamp(datetime.datetime(2019, 2, 6, 17, 0, 0, tzinfo=tz))
t1
Run Code Online (Sandbox Code Playgroud)

输出:

Timestamp('2019-02-06 17:00:00-0753', tz='America/Los_Angeles')
Run Code Online (Sandbox Code Playgroud)

为什么是-0753?

更新:经过一些研究,这种方式似乎有效:我可能没有以正确的方式做,见下文

tz = pytz.timezone('America/Los_Angeles')
t1 = datetime.datetime(2019, 2, 6, 17, 0, 0)
t1 = tz.localize(t1)
t1 = pd.Timestamp(t1)
t1
Run Code Online (Sandbox Code Playgroud)

输出:

Timestamp('2019-02-06 17:00:00-0800', tz='America/Los_Angeles')
Run Code Online (Sandbox Code Playgroud)

tzinfo传递给 then 时应该是什么样的对象datetime.datetime

Olv*_*ght 6

我不知道为什么,但这个奇怪的时区偏移来自 pytz。参见下面的代码:

\n
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone(\'America/Los_Angeles\')))\n2019-05-10 00:00:00-07:53\n\n>>>print(pytz.timezone(\'America/Los_Angeles\').localize(datetime(2019, 5, 10)))\n2019-05-10 00:00:00-07:00\n
Run Code Online (Sandbox Code Playgroud)\n

因此,如果您尝试创建 datetime 并提供tzinfo,它将创建此偏移量。

\n

更新。

\n

我检查了 pytz文档并发现了下一个:

\n
\n

不幸的是,使用标准日期时间构造函数 \xe2\x80\x98\xe2\x80\x99 的 tzinfo 参数对于许多时区的 pytz 不起作用\xe2\x80\x99\xe2\x80\x99 。

\n

...

\n

不过,对于没有夏令时转换的时区(例如 UTC)来说是安全的。

\n
\n

好吧,他们说了,但没有指出原因。让我们试着找到它。在 pytz 来源中,我找到了他们使用的IANA 数据库版本:

\n
OLSON_VERSION = \'2019a\'\n
Run Code Online (Sandbox Code Playgroud)\n

在文件“northamerica”中下载并解压该数据库后,我发现了以下内容:

\n
# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]\nZone America/Los_Angeles -7:52:58 - LMT 1883 Nov 18 12:07:02\n            -8:00   US  P%sT    1946\n            -8:00   CA  P%sT    1967\n            -8:00   US  P%sT\n
Run Code Online (Sandbox Code Playgroud)\n

-7:52:58-07:53与我们已经非常接近了。

\n

结论: pytz 中的某个地方有一个数据库,其中包含所有已知的时区偏移量。当我们将 tzinfo 传递到 datetime 的构造函数时,它会获取第一个已知时区,并在 localize 方法(调用Replace()并传递 tzinfo )时使用它,以某种方式获取正确的时区偏移量。

\n

为了检查它,我在同一个文件中找到了另一个时区:

\n
# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]\nZone America/Toronto    -5:17:32 -  LMT 1895\n            -5:00   Canada  E%sT    1919\n            -5:00   Toronto E%sT    1942 Feb  9  2:00s\n            -5:00   Canada  E%sT    1946\n            -5:00   Toronto E%sT    1974\n            -5:00   Canada  E%sT\n
Run Code Online (Sandbox Code Playgroud)\n

然后我启动了下一个代码:

\n
>>>print(datetime(2019, 5, 10, tzinfo=pytz.timezone(\'America/Toronto\')))\n2019-05-10 00:00:00-05:18\n
Run Code Online (Sandbox Code Playgroud)\n

如您所见,结果是相同的。它使用了-5:17:32,它是列表中的第一个偏移量。

\n