使用 strptime() 解析日期/时间字符串时如何保留时区?

2024-12-24 08:55:00
admin
原创
68
摘要:问题描述:我有一个使用 IPDDump 创建的 Blackberry IPD 备份的 CSV 转储文件。这里的日期/时间字符串如下所示(其中EST是澳大利亚时区):Tue Jun 22 07:46:22 EST 2010 我需要能够在 Python 中解析这个日期。起初,我尝试使用strptime()date...

问题描述:

我有一个使用 IPDDump 创建的 Blackberry IPD 备份的 CSV 转储文件。这里的日期/时间字符串如下所示(其中EST是澳大利亚时区):

Tue Jun 22 07:46:22 EST 2010

我需要能够在 Python 中解析这个日期。起初,我尝试使用strptime()datettime 中的函数。

>>> datetime.datetime.strptime('Tue Jun 22 12:10:20 2010 EST', '%a %b %d %H:%M:%S %Y %Z')

然而,由于某种原因,datetime返回的对象似乎没有任何tzinfo关联。

我确实读过这个页面,显然是datetime.strptime默默地丢弃了tzinfo,但是,我检查了文档,却找不到任何与此相关的记录。

有没有什么办法可以strptime()很好地适应时区?


解决方案 1:

我建议使用python-dateutil。它的解析器能够解析迄今为止我所输入的所有日期格式。

>>> from dateutil import parser
>>> parser.parse("Tue Jun 22 07:46:22 EST 2010")
datetime.datetime(2010, 6, 22, 7, 46, 22, tzinfo=tzlocal())
>>> parser.parse("Fri, 11 Nov 2011 03:18:09 -0400")
datetime.datetime(2011, 11, 11, 3, 18, 9, tzinfo=tzoffset(None, -14400))
>>> parser.parse("Sun")
datetime.datetime(2011, 12, 18, 0, 0)
>>> parser.parse("10-11-08")
datetime.datetime(2008, 10, 11, 0, 0)

等等。无需处理strptime()格式问题...只需输入一个日期,它就会执行正确的操作。

解决方案 2:

由于strptime返回具有属性的日期时间对象tzinfo,我们可以简单地将其替换为所需的时区。

>>> import datetime

>>> date_time_str = '2018-06-29 08:15:27.243860'
>>> date_time_obj = datetime.datetime.strptime(date_time_str, '%Y-%m-%d %H:%M:%S.%f').replace(tzinfo=datetime.timezone.utc)
>>> date_time_obj.tzname()
'UTC'

解决方案 3:

模块datetime文档说明:

返回与 date_string 对应的日期时间,根据格式解析。这相当于datetime(*(time.strptime(date_string, format)[0:6]))

看到了吗[0:6]?这让你明白了(year, month, day, hour, minute, second)。没有别的。没有提到时区。

有趣的是,[Win XP SP2、Python 2.6、2.7] 传递您的示例time.strptime不起作用,但如果您去掉“ %Z”和“ EST”,它就可以工作。此外,使用“UTC”或“GMT”代替“EST”也可以。“PST”和“MEZ”不起作用。令人费解。

值得注意的是,它已从 3.2 版更新,并且同一文档现在还指出了以下内容:

当 %z 指令被提供给 strptime() 方法时,将生成一个感知型 datetime 对象。结果的 tzinfo 将设置为时区实例。

请注意,这不适用于 %Z,因此大小写很重要。请参见以下示例:

In [1]: from datetime import datetime

In [2]: start_time = datetime.strptime('2018-04-18-17-04-30-AEST','%Y-%m-%d-%H-%M-%S-%Z')

In [3]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: None

In [4]: start_time = datetime.strptime('2018-04-18-17-04-30-+1000','%Y-%m-%d-%H-%M-%S-%z')

In [5]: print("TZ NAME: {tz}".format(tz=start_time.tzname()))
TZ NAME: UTC+10:00

解决方案 4:

您的时间字符串类似于rfc 2822 (电子邮件、http 标头中的日期格式)中的时间格式。您可以仅使用 stdlib 来解析它:

>>> from email.utils import parsedate_tz
>>> parsedate_tz('Tue Jun 22 07:46:22 EST 2010')
(2010, 6, 22, 7, 46, 22, 0, 1, -1, -18000)

查看针对各种 Python 版本产生时区感知日期时间对象的解决方案:从电子邮件中解析带有时区的日期。

在这种格式中, EST在语义上等同于-0500。虽然一般来说,时区缩写不足以唯一地标识时区。

解决方案 5:

遇到了这个确切的问题。

我最终做了什么:

# starting with date string
sdt = "20190901"
std_format = '%Y%m%d'

# create naive datetime object
from datetime import datetime
dt = datetime.strptime(sdt, sdt_format)

# extract the relevant date time items
dt_formatters = ['%Y','%m','%d']
dt_vals = tuple(map(lambda formatter: int(datetime.strftime(dt,formatter)), dt_formatters))

# set timezone
import pendulum
tz = pendulum.timezone('utc')

dt_tz = datetime(*dt_vals,tzinfo=tz)
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   990  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   26  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   27  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   26  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   53  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用