python strTime从UTC字符串到datetime正则表达式re.sub
我使用下面的方法将UTC字符串转换为日期时间,除非毫秒超过6位。比它吹的还厉害。呃*&^*&python strTime从UTC字符串到datetime正则表达式re.sub,python,regex,Python,Regex,我使用下面的方法将UTC字符串转换为日期时间,除非毫秒超过6位。比它吹的还厉害。呃*&^*& format = '%Y-%m-%dT%H:%M:%S' if '.' in value: format = format + '.%f' if value.endswith('Z'): format = format + 'Z' return datetime.strptime(value, format) 这是stacktrace File "/usr/lib6
format = '%Y-%m-%dT%H:%M:%S'
if '.' in value:
format = format + '.%f'
if value.endswith('Z'):
format = format + 'Z'
return datetime.strptime(value, format)
这是stacktrace
File "/usr/lib64/python2.6/_strptime.py", line 325, in _strptime
(data_string, format))
ValueError: time data '2013-07-19T13:02:53.8241899Z' does not match format '%Y-%m-%dT%H:%M:%S.%fZ'
有什么方法可以将毫秒长度限制为6位。我使用了“{:%Y-%m-%dT%H:%m:%S.6%f}”。格式(日期时间)
,但这有助于取消/
因此,尝试re.sub()来限制所提供字符串中“.”字符后面的小数(如果有)。但我不是很懂正则表达式
我在机器上使用Python2.6.*。听起来像是一项工作
听起来像是一份适合你的工作
如果您想使用
re.sub
,这里有一个简短的示例,说明一种方法
import re
from datetime import datetime
value = '2013-07-19T13:02:53.8241899Z'
regex = r"(\d{6,}\d+)"
if re.search(regex, value):
repl = lambda x: x.group(0)[:6]
value = re.sub(pattern=regex, repl=repl, string=value)
format = '%Y-%m-%dT%H:%M:%S'
if '.' in value:
format = format + '.%f'
if value.endswith('Z'):
format = format + 'Z'
print datetime.strptime(value, format)
如果您想使用
re.sub
,这里有一个简短的示例,说明一种方法
import re
from datetime import datetime
value = '2013-07-19T13:02:53.8241899Z'
regex = r"(\d{6,}\d+)"
if re.search(regex, value):
repl = lambda x: x.group(0)[:6]
value = re.sub(pattern=regex, repl=repl, string=value)
format = '%Y-%m-%dT%H:%M:%S'
if '.' in value:
format = format + '.%f'
if value.endswith('Z'):
format = format + 'Z'
print datetime.strptime(value, format)
您可以使用
.partition()
方法来解析字符串:
from datetime import datetime
sz = '2013-07-19T13:02:53.8241899Z' # utc time in rfc3339 format (without offset)
sz = sz.rstrip('Z') # remove ending 'Z' if present
timestr, _, digits = sz.partition('.')
utc_dt = datetime.strptime(timestr, '%Y-%m-%dT%H:%M:%S')
if digits:
microseconds = int(digits, 10) * 10**(6 - len(digits))
utc_dt = utc_dt.replace(microsecond=int(microseconds + .5))
如果您想使用re.sub
并且不介意截断微秒:
import re
from datetime import datetime
sz = '2013-07-19T13:02:53.8241899Z'
if '.' in sz:
sz = re.sub(r'(\.\d{,6})\d*Z?$', r'\1Z', sz) # truncate to 6 digits +Z
else: # no fractions
sz = sz.rstrip('Z') + '.0Z'
utc_dt = datetime.strptime(sz, '%Y-%m-%dT%H:%M:%S.%fZ')
您可以使用
.partition()
方法来解析字符串:
from datetime import datetime
sz = '2013-07-19T13:02:53.8241899Z' # utc time in rfc3339 format (without offset)
sz = sz.rstrip('Z') # remove ending 'Z' if present
timestr, _, digits = sz.partition('.')
utc_dt = datetime.strptime(timestr, '%Y-%m-%dT%H:%M:%S')
if digits:
microseconds = int(digits, 10) * 10**(6 - len(digits))
utc_dt = utc_dt.replace(microsecond=int(microseconds + .5))
如果您想使用re.sub
并且不介意截断微秒:
import re
from datetime import datetime
sz = '2013-07-19T13:02:53.8241899Z'
if '.' in sz:
sz = re.sub(r'(\.\d{,6})\d*Z?$', r'\1Z', sz) # truncate to 6 digits +Z
else: # no fractions
sz = sz.rstrip('Z') + '.0Z'
utc_dt = datetime.strptime(sz, '%Y-%m-%dT%H:%M:%S.%fZ')
你真的需要6位数的毫秒吗如果代码本身包含
sz
和value
的值,则此示例代码段可能更好。要生成正确的字符串,可以使用datetime.utcnow().isoformat()+'Z'
。它似乎不限制小数点后的位数。所以,如果输入字符串以Z
结尾,那么在您的情况下,它是一个有效的rfc3339日期。不,我不需要6位数字。这个日期不在我的控制范围内。你真的需要6位数的毫秒吗如果代码本身包含sz
和value
的值,则此示例代码段可能更好。要生成正确的字符串,可以使用datetime.utcnow().isoformat()+'Z'
。它似乎不限制小数点后的位数。所以,如果输入字符串以Z
结尾,那么在您的情况下,它是一个有效的rfc3339日期。不,我不需要6位数字。该日期不在我的控制范围内dateutil
截断微秒而不是四舍五入。无论如何,将其用于以Z
结尾的rfc3339格式是一种过分的做法。thnx。截断是可以的。从长远来看,可能会给它一个机会。关于。dateutil
截断微秒而不是四舍五入。无论如何,将其用于以Z
结尾的rfc3339格式是一种过分的做法。thnx。截断是可以的。从长远来看,可能会给它一个机会。谢谢你。如果re.sub方法证明太慢,我会给你的打一针。谢谢你。如果re.sub方法证明太慢,我会给你的打一针。当做