Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python strTime从UTC字符串到datetime正则表达式re.sub_Python_Regex - Fatal编程技术网

python strTime从UTC字符串到datetime正则表达式re.sub

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

我使用下面的方法将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/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方法证明太慢,我会给你的打一针。当做