Python Datetime模块和Pandas to_Datetime给出不同的结果
我有一个包含UTC日期时间的字符串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_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_时间有两种不同的形式:实际utc2017-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')