从 python 中的时间格式解析和提取值
Parse and extract values from time format in python
我正在尝试从我的时间数据中解析和提取值 2018-03-11 13:15:31.734874+01:00
。
我正在使用 strptime()
以 %Y %m %d %H:%M:%S.%f %Z
格式执行此操作,但出现此错误:
ValueError: time data '2018-03-11 13:15:31.734874+01:00' does not match format '%Y %m %d %H:%M:%S.%f %Z'
此外,我不知道如何处理我的时间数据中的 +1:00
。有人可以帮忙吗?
%Y %m %d
应更改为 %Y-%m-%d
以匹配时间字符串。此外,您需要从输入中删除最后一个 :
以与 %z
一起使用。
这是你应该做的:
import datetime
s = '2018-03-11 13:15:31.734874+01:00'
print(datetime.datetime.strptime(''.join(s.rsplit(':', 1)), '%Y-%m-%d %H:%M:%S.%f%z'))
# 2018-03-11 13:15:31.734874+01:00
最初:
%Y %m %d
将不匹配 2018-03-11
。您需要使其适应时间字符串! %Y-%m-%d
相反应该工作。
其次:
如果您在 python3,则为时间戳添加了 %z
。但是时间戳必须没有冒号,例如+0100
而不是 +01:00
。因此,如果您使用 python3 这有效:
>>> time_string = '2018-03-11 13:15:31.734874+01:00'
>>> time_string = ''.join(time_string.rsplit(':', 1))
>>> datetime.datetime.strptime(time_string, '%Y-%m-%d %H:%M:%S.%f%z')
datetime.datetime(2018, 3, 11, 13, 15, 31, 734874, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)))
顺便说一下,编辑后的 time_string 看起来像这样:
>>> time_string
'2018-03-11 13:15:31.734874+0100'
如果是python2,%z
就不行了,这里要用到dateutil模块的parse函数,是直截了当的。
>>> from dateutil.parser import parse
>>> parse('2018-03-11 13:15:31.734874+01:00')
datetime.datetime(2018, 3, 11, 13, 15, 31, 734874, tzinfo=tzoffset(None, 3600))
这里有两个问题需要解决
首先是格式字符串。它应该是 %Y-%m-%d %H:%M:%S.%f%z
以匹配确切的日期分隔符和时区序列(没有 space)。
From strftime and strptime Behavior:
%z
(lower case) UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). (empty), +0000, -0400, +1030
第二个是时区偏移“+01:00”中的冒号 (:)。可以使用子字符串将其省略:s[:-3]+s[-2:] 或字符串替换。
所以最终答案如下
from datetime import datetime
s = '2018-03-11 13:15:31.734874+01:00'
datetime.strptime(s[:-3]+s[-2:], '%Y-%m-%d %H:%M:%S.%f%z')
我正在尝试从我的时间数据中解析和提取值 2018-03-11 13:15:31.734874+01:00
。
我正在使用 strptime()
以 %Y %m %d %H:%M:%S.%f %Z
格式执行此操作,但出现此错误:
ValueError: time data '2018-03-11 13:15:31.734874+01:00' does not match format '%Y %m %d %H:%M:%S.%f %Z'
此外,我不知道如何处理我的时间数据中的 +1:00
。有人可以帮忙吗?
%Y %m %d
应更改为 %Y-%m-%d
以匹配时间字符串。此外,您需要从输入中删除最后一个 :
以与 %z
一起使用。
这是你应该做的:
import datetime
s = '2018-03-11 13:15:31.734874+01:00'
print(datetime.datetime.strptime(''.join(s.rsplit(':', 1)), '%Y-%m-%d %H:%M:%S.%f%z'))
# 2018-03-11 13:15:31.734874+01:00
最初:
%Y %m %d
将不匹配 2018-03-11
。您需要使其适应时间字符串! %Y-%m-%d
相反应该工作。
其次:
如果您在 python3,则为时间戳添加了 %z
。但是时间戳必须没有冒号,例如+0100
而不是 +01:00
。因此,如果您使用 python3 这有效:
>>> time_string = '2018-03-11 13:15:31.734874+01:00'
>>> time_string = ''.join(time_string.rsplit(':', 1))
>>> datetime.datetime.strptime(time_string, '%Y-%m-%d %H:%M:%S.%f%z')
datetime.datetime(2018, 3, 11, 13, 15, 31, 734874, tzinfo=datetime.timezone(datetime.timedelta(0, 3600)))
顺便说一下,编辑后的 time_string 看起来像这样:
>>> time_string
'2018-03-11 13:15:31.734874+0100'
如果是python2,%z
就不行了,这里要用到dateutil模块的parse函数,是直截了当的。
>>> from dateutil.parser import parse
>>> parse('2018-03-11 13:15:31.734874+01:00')
datetime.datetime(2018, 3, 11, 13, 15, 31, 734874, tzinfo=tzoffset(None, 3600))
这里有两个问题需要解决
首先是格式字符串。它应该是 %Y-%m-%d %H:%M:%S.%f%z
以匹配确切的日期分隔符和时区序列(没有 space)。
From strftime and strptime Behavior:
%z
(lower case) UTC offset in the form +HHMM or -HHMM (empty string if the object is naive). (empty), +0000, -0400, +1030
第二个是时区偏移“+01:00”中的冒号 (:)。可以使用子字符串将其省略:s[:-3]+s[-2:] 或字符串替换。
所以最终答案如下
from datetime import datetime
s = '2018-03-11 13:15:31.734874+01:00'
datetime.strptime(s[:-3]+s[-2:], '%Y-%m-%d %H:%M:%S.%f%z')