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

Python Datetime模块和Pandas to_Datetime给出不同的结果,python,pandas,datetime,utc,localtime,Python,Pandas,Datetime,Utc,Localtime,我有一个包含UTC日期时间的字符串 utc_str = '2017-11-21T23:00+0100' 在我的当地时间(欧洲/柏林)是: 和是我希望从utc\u string获得的所需值 我可以使用以下方法将utc\u字符串转换为local\u时间: import datetime as dt utc_time = dt.datetime.strptime(date_str, '%Y-%m-%dT%H:%M%z') local_time = utc_time.replace(tzinfo=py

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

utc_str = '2017-11-21T23:00+0100'
在我的当地时间(欧洲/柏林)是:

和是我希望从
utc\u string
获得的所需值

我可以使用以下方法将
utc\u字符串
转换为
local\u时间

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
然而,当我使用熊猫时,我得到了不同的结果。它似乎没有应用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还是其他什么错误?在Python3.6、Windows7上。

如评论中所述,我认为您的本地时间代码是错误的

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

地方时
您的
utc\u time
对象位于正确的时区,因此如果您想要本地时间,您可以执行
utc\u time.strftime(“%Y-%m-%d%H:%m”)
在pandas中,您必须执行
pd.to\u datetime(utc\u str,utc=True)。astimezone(pytz.timezone(“%欧洲/柏林”)。strftime(“%Y-%m-%d%H:%m”)

是否指定时区
+0100(欧洲/柏林)而不是UTC?这是UTCSo中的
22:00
,如果我理解正确,字符串的标签错误或者utc格式错误?那是什么形式的呢?这是我拥有的数据,因此我需要知道如何处理它。使用
replace
计算本地时间是错误的。你可以只做
astimezone(…)
,就像
pd\u date=pd.to\u datetime(date\u str,utc=True)。astimezone(pytz.timezone('Europe/Rome'))
?的确如此。您可以使用
pd.Series([pd.to_datetime(utc\u str,utc=True)]).dt.tz\u convert(pytz.timezone('Europe/Berlin'))对整个
系列执行此操作。似乎utc_时间有两种不同的形式:实际utc
2017-11-21 23:00
,然后是本地偏移量
+0100
,当这些时间加在一起时,您将获得所需的本地时间
2017-11-22 00:00
。我想这个字符串应该删除偏移量,然后将其作为时间增量添加,因为
utc\u time
似乎是一种非感官形式。我的意思是
utc\u str
而不是
utc\u time
utc\u字符串
不是一个utc时间字符串,但是是本地时间表示法。那么,是否可以从所谓的“
utc_str
”输出
2017-11-22 00:00
?使用
pd.to_datetime(utc\u str,utc=True).astimezone(pytz.timezone('Europe/Berlin')).strftime('%Y-%m-%d%H:%m')
给出
2017-11-21 23:00
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>)'
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>)"
pd.to_datetime(utc_str, utc=True)
Timestamp('2017-11-21 22:00:00+0000', tz='UTC')