Python ISO 8601日期时间解析

时间:2017-09-22 15:41:56

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

我有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周的星期二)
  5. 我能够获得第一,第二和第四个例子,但是对于第三个例子,我在尝试时得到了追溯。

    我在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')
    

    当我在终端上尝试第3次尝试阻止时,这是我得到的错误

    >>> 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').
    

    这就是我第四个工作的原因:

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

    以下是我的代码的参考:strptime documentation

    关于来自ISO 8601格式的日期解析,关于SO有很多问题,但我无法找到解决我的问题的问题。此外,所涉及的问题都非常陈旧,并且使用%G%Vstrptime指令不可用的旧版python。

1 个答案:

答案 0 :(得分:0)

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]>

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