【问题标题】:Changing string to UTC to dateTime object将字符串更改为 UTC 到 dateTime 对象
【发布时间】:2020-06-24 16:25:46
【问题描述】:

我有time = '2020-06-24T13:30:00-04:00'。如何将其更改为 UTC 时间的 dateTime 对象。我不想使用pd.Timestamp(time).tz_convert("UTC").to_pydatetime(),因为它会返回一个看起来像datetime.datetime(2020, 6, 24, 17, 30, tzinfo=<UTC>) 的奇怪输出。结果,当我检查与 datetime.datetime(2020, 6, 24, 17, 30) 是否相等时,它返回 False。

编辑:

import datetime
import pytz

time = '2020-06-24T13:30:00-04:00

dt = datetime.datetime(2020, 6, 24, 17, 30)
print("dt: ",dt)

so = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%S%z').astimezone(pytz.utc)
print("so:",so)

print(dt == so)

输出

dt: 2020-06-24 17:30:00
so: 2020-06-24 17:30:00+00:00
False

我怎样才能让它正确地评估为 True?

【问题讨论】:

    标签: python string date datetime


    【解决方案1】:

    #1 由于您的字符串与ISO 8601 兼容,请在Python 3.7+ 上使用fromisoformat()

    from datetime import datetime, timezone
    
    s = '2020-06-24T13:30:00-04:00'
    
    dtobj = datetime.fromisoformat(s)
    # dtobj
    # datetime.datetime(2020, 6, 24, 13, 30, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
    

    请注意,这将为您提供一个时区感知的日期时间对象; tzinfo 属性是 UTC 偏移量。您可以使用 astimezone() 轻松将其转换为 UTC:

    dtobj_utc = dtobj.astimezone(timezone.utc)
    # dtobj_utc
    # datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)
    

    #2您可以使用strptime 实现相同的功能(也可以根据this 实现Python3.7+):

    dtobj = datetime.strptime(s, '%Y-%m-%dT%H:%M:%S%z')
    dtobj_utc = dtobj.astimezone(timezone.utc)
    # dtobj_utc
    # datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)
    

    #3如果你想把结果变成一个朴素的日期时间对象,即移除 tzinfo 属性,替换为None

    dtobj_utc_naive = dtobj_utc.replace(tzinfo=None)
    # dtobj_utc_naive
    # datetime.datetime(2020, 6, 24, 17, 30)
    

    #4 对于较旧的 Python 版本,您应该可以使用 dateutil 的解析器:

    from dateutil import parser
    dtobj = parser.parse(s)
    dtobj_utc = dtobj.astimezone(timezone.utc)
    dtobj_utc_naive = dtobj_utc.replace(tzinfo=None)
    # dtobj_utc_naive
    # datetime.datetime(2020, 6, 24, 17, 30)
    

    【讨论】:

    • 天真的日期时间对象有什么好处吗?
    • @Danlo9:好问题……这取决于。原则上,最好有时区信息,除非您知道(肯定)all您使用的 datetime 对象属于 same 时区。另外请记住,您不应该混淆天真和有意识的日期时间对象 - 始终使用其中一个(以保持理智)。
    【解决方案2】:

    好吧,所以我之前的回答有点古怪,因为我没有完全理解你的问题,所以我正在重写它。您的问题是您正在从字符串构造一个日期时间对象,并且它是时区感知(UTC)。但是,每当您在 python 中创建日期时间对象 dt = datetime.datetime(2020, 6, 24, 17, 30) 时,它都会创建它但没有时区信息(您可以使用 .tzinfo 对其进行检查)。您需要做的就是在第一次创建dt 时区。请参阅下面的代码片段。

    
    import datetime
    
    time = '2020-06-24T13:30:00-04:00'
    
    dt = datetime.datetime(2020, 6, 24, 17, 30, tzinfo=datetime.timezone.utc)
    
    print("dt: ",dt.tzinfo)
    
    so = datetime.datetime.strptime(time, '%Y-%m-%dT%H:%M:%S%z')
    
    print("so:",so.tzinfo)
    
    print(dt == so)
    
    

    【讨论】:

    • 虽然这不会将时间更改为 UTC...它返回 2020-06-24 13:30:00-04:00 但我需要它是 2020-06-24 17:30:00
    • 我建议您将要比较的内容与时区感知进行比较。
    • 整个答案不是最优的,看看新的答案。
    • 现在你导入pytz,你也不需要它,因为有datetime.timezone.utc ;-) 旁注:datetime.timezone.utc 和 pytz.utc not 比较相等。
    • 嗯,这是来自以前的测试,我没有删除时区变量或 pytz 导入,但代码确实可以正常工作并且解释是正确的。
    猜你喜欢
    • 2018-05-11
    • 2020-09-27
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2013-04-04
    相关资源
    最近更新 更多