【问题标题】:Datetime module and Pandas to_datetime give different resultsDatetime 模块和 Pandas to_datetime 给出不同的结果
【发布时间】:2018-05-07 03:36:32
【问题描述】:

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

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

在我的当地时间(欧洲/柏林)是:

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 上。

【问题讨论】:

  • 没有'2017-11-21T23:00+0100' 指定时区+0100(欧洲/柏林)而不是UTC?这是22:00 UTC
  • 所以如果我理解正确,字符串要么标记错误,要么 utc 格式错误?那它是什么形式的呢?它在我拥有的数据中,所以我需要知道如何处理它。
  • 您使用replace 计算本地时间是错误的。你可以做astimezone(...)
  • 那么喜欢pd_date = pd.to_datetime(date_str, utc=True).astimezone(pytz.timezone('Europe/Rome'))?
  • 确实如此。您可以使用tz_convert pd.Series([pd.to_datetime(utc_str, utc=True)]).dt.tz_convert(pytz.timezone('Europe/Berlin')) 对整个Series 执行此操作

标签: python pandas datetime utc localtime


【解决方案1】:

如评论中所述,我认为您的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')

【讨论】:

  • 我明白了。 utc_time 似乎有两种不同的形式:实际的 UTC 2017-11-21 23:00 和本地偏移量 +0100,当它们加在一起时,您将获得所需的本地时间 2017-11-22 00:00。我想这个字符串可能应该只是删除偏移量,然后将其添加为 timedelta,因为utc_time 似乎是一种无意义的形式。
  • 我的意思是 utc_str 而不是 utc_time
  • utc_string 不是 UTC 时间字符串,而是本地时间表示。
  • 那么有没有办法从所谓的“utc_str”输出2017-11-22 00:00?使用pd.to_datetime(utc_str, utc=True).astimezone(pytz.timezone('Europe/Berlin')).strftime('%Y-%m-%d %H:%M') 得到2017-11-21 23:00
猜你喜欢
  • 2022-10-05
  • 2020-11-23
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多