Datetime 模块和 Pandas to_datetime 给出不同的结果

Datetime module and Pandas to_datetime give different results

我有一个包含 UTC 日期时间的字符串

utc_str = '2017-11-21T23:00+0100'

我当地时间 (Europe/Berlin) 是:

local_time = '2017-11-22 00:00'

并且是我想从 utc_string 获得的期望值。

我可以使用以下方法将 utc_string 转换为 local_time

import datetime as dt
utc_time = dt.datetime.strptime(date_str, '%Y-%m-%dT%H:%M%z')
local_time = utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))

print(local_time.strftime('%Y-%m-%d %H:%M'))
>>> 2017-11-22 00:00

然而,当我使用 Pandas 时,我得到了不同的结果。它似乎没有应用 UTC 偏移量:

import pandas as pd
pd_date = pd.to_datetime(date_str, utc=True)

print(pd_date.strftime('%Y-%m-%d %H:%M'))
>>> '2017-11-21 22:00'

如果我天真地尝试执行与 datetime 模块相同的过程, 结果仍然关闭:

pd_date = pd.to_datetime(date_str, utc=True)
pd_date = pd_date.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))

print(pd_date.strftime('%Y-%m-%d %H:%M'))
>>> '2017-11-21 23:00'

有什么我不明白的地方吗?我使用 pd.to_datetime 还是其他错误?在 Python 3.6,Windows 7.

如评论中所述,我认为您 local_time 的代码是错误的

utc_time
datetime.datetime(2017, 11, 21, 23, 0, tzinfo=datetime.timezone(datetime.timedelta(0, 3600))
utc_time.replace(tzinfo=pytz.utc)
'datetime.datetime(2017, 11, 21, 23, 0, tzinfo=<UTC>)'

因此 replacedatetime 中删除了 '+0100,但保持其余部分不变

utc_time.replace(tzinfo=pytz.utc).astimezone(pytz.timezone('Europe/Berlin'))
"datetime.datetime(2017, 11, 22, 0, 0, tzinfo=<DstTzInfo 'Europe/Berlin' CET+1:00:00 STD>)"

然后 23:00UTC 增加 1 小时,因此如预期的那样成为柏林的第二天午夜

pd.to_datetime(utc_str, utc=True)
Timestamp('2017-11-21 22:00:00+0000', tz='UTC')

行为上的差异是由于构造函数造成的。 pd.to_datetime 将时间和时区计算回 22:00UTC 而不是 23:00+0100,因此如果您将时区信息替换为 UTC,它不会改变任何内容

当地时间

你的 utc_time 对象在正确的时区,所以如果你想要本地时间你可以在 pandas 中做 utc_time.strftime('%Y-%m-%d %H:%M') 你必须做 pd.to_datetime(utc_str, utc=True).astimezone(pytz.timezone('Europe/Berlin')).strftime('%Y-%m-%d %H:%M')