【问题标题】:Python ISO 8601 datetime parsingPython ISO 8601 日期时间解析
【发布时间】:2017-09-22 15:41:55
【问题描述】:

我有不同类型的ISO 8601 格式化日期字符串,使用datetime library,我想从这些字符串中获取datetime object

输入字符串示例:

  1. 2017-08-01(2017 年 8 月 1 日)
  2. 2017-09(2017 年 9 月)
  3. 2017-W20(第 20 周)
  4. 2017-W37-2(第 37 周的星期二)

我能够获得第 1、第 2 和第 4 个示例,但是对于第 3 个示例,我在尝试时得到了回溯。

我在 try-except 块中为它们使用 datetime.datetime.strptime 函数,如下:

try :
    d1 = datetime.datetime.strptime(date,'%Y-%m-%d')
except :
    try :
        d1 = datetime.datetime.strptime(date,'%Y-%m')
    except :
        try :
            d1 = datetime.datetime.strptime(date,'%G-W%V')
        except :
            print('Not going through')

当我在终端上尝试第三个 try 块时,这是我得到的错误

>>> dstr
'2017-W38'
>>> dt.strptime(dstr,'%G-W%V')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\tushar.aggarwal\Desktop\Python\Python3632\lib\_strptime.py", line 565, in _strptime_datetime
    tt, fraction = _strptime(data_string, format)
  File "C:\Users\tushar.aggarwal\Desktop\Python\Python3632\lib\_strptime.py", line 483, in _strptime
    raise ValueError("ISO year directive '%G' must be used with "
ValueError: ISO year directive '%G' must be used with the ISO week directive '%V' and a weekday directive ('%A', '%a', '%w', or '%u').

这就是我如何处理第 4 个案例:

>>> dstr
'2017-W38-2'
>>> dt.strptime(dstr,'%G-W%V-%u')
datetime.datetime(2017, 9, 19, 0, 0)

这是我的代码的参考:strptime documentation

关于从ISO 8601 格式解析日期有很多问题,但我找不到解决我的问题的问题。此外,所涉及的问题非常古老,并且采用较旧版本的python,其中strptime 中的%G%V 指令不可用。

【问题讨论】:

  • datetime 中的解析有限。查看模块dateutil

标签: python datetime python-3.6 iso8601 python-datetime


【解决方案1】:

pendulum 库在这些方面做得很好。

>>> import pendulum
>>> pendulum.parse('2017-08-01')
<Pendulum [2017-08-01T00:00:00+00:00]>
>>> pendulum.parse('2017-09')
<Pendulum [2017-09-01T00:00:00+00:00]>
>>> pendulum.parse('2017-W20')
<Pendulum [2017-05-15T00:00:00+00:00]>
>>> pendulum.parse('2017-W37-2')
<Pendulum [2017-09-12T00:00:00+00:00]>

我在链接中向您推荐的页面显示,“该库本身支持 RFC 3339 格式、大多数 ISO 8601 格式和一些其他常见格式。如果您传递非标准或更复杂的字符串,库将回退到 dateutil 解析器。'

【讨论】:

  • 获取Pendulum对象后(解析后),能否从这个摆对象中获取datetime对象?
  • 你不需要,因为 pendulum 继承自 datetime。是直接替换。除了在相当有限的情况下(参见pendulum.eustace.io/faq),你可以用 datetime 做的任何事情都可以用 pendulum 做——还有更多。只需导入摆而不是日期时间。如果您确实想将实例转换为日期时间,请使用它的一个或多个属性,adate.year、adate.month、adate.day 等。但这几乎总是不必要的。
猜你喜欢
  • 2013-05-14
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
  • 2011-06-17
  • 2021-01-17
  • 2010-10-23
相关资源
最近更新 更多