datetime strptime - 设置格式以忽略字符串的结尾部分
datetime strptime - set format to ignore trailing part of string
我有一个可变长度的字符串,我想为 strptime
提供一种格式,以便忽略字符串的其余部分。让我举例说明。我有类似的东西
9/4/2013,00:00:00,7.8,7.4,9.53
10/4/2013,00:00:00,8.64,7.4,9.53
并且我想要一种使命令 strptime(line,format)
能够读取这些行的格式。像 format='%d/%m/%Y,%H:%M:%S*'
这样的东西,虽然我知道那是行不通的。我想我的问题有点类似于 this one,但没有答案可以帮助我,而且我的问题更糟,因为我的字符串的全长可能会有所不同。我觉得 dateutil
可以解决我的问题,但我找不到可以解决问题的方法。
我可能会做类似 strptime(''.join(line.split(',')[:2]),format)
的事情,但我不想用它来解决与用户相关的问题。
您不能 datetime.strptime()
忽略部分输入。;您的仅选项确实是首先拆分多余的文本。
所以是的,您确实必须拆分并重新加入您的字符串:
format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(','.join(line.split(',', 2)[:2]), format)
或者寻找一些其他方法来提取信息。您可以使用正则表达式,例如:
datetime_pattern = re.compile(r'(\d{1,2}/\d{1,2}/\d{4},\d{2}:\d{2}:\d{2})')
format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(datetime_pattern.search(line).group(), format)
要在不拆分时间字符串和丢弃额外文本的情况下构建格式字符串,只需将额外文本包含在格式字符串中即可。 t[t.index(',',t.index(',') + 1):]
是额外的文字。
from datetime import datetime
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
print datetime.strptime(t,'%d/%m/%Y,%H:%M:%S'+t[t.index(',',t.index(',')+1):])
如果字符串有'%'可以用空字符串代替。
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
t = t.replace('%','')
fmt = '%d/%m/%Y,%H:%M:%S' + t[t.index(',',t.index(',')+1):]
print datetime.strptime(t, fmt)
或者使用字符串切片和静态格式字符串,
for t in l:
print datetime.strptime(t[:t.find(',',t.find(',')+1)],'%d/%m/%Y,%H:%M:%S')
2013-04-0900:00:00
2013-04-10 00:00:00
看看 datetime-glob,这是我们开发的用于从文件列表中解析 date/times 的模块。您可以使用 datetime_glob.PatternSegment
来解析任意字符串:
>>> import datetime_glob
>>> patseg = datetime_glob.parse_pattern_segment('%-d/%-m/%Y,%H:%M:%S*')
>>> match = datetime_glob.match_segment('9/4/2013,01:02:03,7.8,7.4,9.53',
patseg)
>>> match.as_datetime()
datetime.datetime(2013, 4, 9, 1, 2, 3)
也使用正则表达式,因为 python datetime
不允许忽略字符,此版本使用非捕获组(抱歉,该示例与您的问题无关):
import datetime, re
date_re = re.compile(r'([^.]+)(?:\.[0-9]+) (\+[0-9]+)')
date_str = "2018-09-06 04:15:18.334232115 +0000"
date_str = " ".join(date_re.search(date_str).groups())
date_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S %z")
像@marjin 建议的那样使用正则表达式要好得多,这样你的代码更易于理解和更新。
我有一个可变长度的字符串,我想为 strptime
提供一种格式,以便忽略字符串的其余部分。让我举例说明。我有类似的东西
9/4/2013,00:00:00,7.8,7.4,9.53
10/4/2013,00:00:00,8.64,7.4,9.53
并且我想要一种使命令 strptime(line,format)
能够读取这些行的格式。像 format='%d/%m/%Y,%H:%M:%S*'
这样的东西,虽然我知道那是行不通的。我想我的问题有点类似于 this one,但没有答案可以帮助我,而且我的问题更糟,因为我的字符串的全长可能会有所不同。我觉得 dateutil
可以解决我的问题,但我找不到可以解决问题的方法。
我可能会做类似 strptime(''.join(line.split(',')[:2]),format)
的事情,但我不想用它来解决与用户相关的问题。
您不能 datetime.strptime()
忽略部分输入。;您的仅选项确实是首先拆分多余的文本。
所以是的,您确实必须拆分并重新加入您的字符串:
format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(','.join(line.split(',', 2)[:2]), format)
或者寻找一些其他方法来提取信息。您可以使用正则表达式,例如:
datetime_pattern = re.compile(r'(\d{1,2}/\d{1,2}/\d{4},\d{2}:\d{2}:\d{2})')
format = '%d/%m/%Y,%H:%M:%S'
datetime.strptime(datetime_pattern.search(line).group(), format)
要在不拆分时间字符串和丢弃额外文本的情况下构建格式字符串,只需将额外文本包含在格式字符串中即可。 t[t.index(',',t.index(',') + 1):]
是额外的文字。
from datetime import datetime
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
print datetime.strptime(t,'%d/%m/%Y,%H:%M:%S'+t[t.index(',',t.index(',')+1):])
如果字符串有'%'可以用空字符串代替。
l = ['9/4/2013,00:00:00,7.8,7.4,9.53', '10/4/2013,00:00:00,8.64,7.4,9.53']
for t in l:
t = t.replace('%','')
fmt = '%d/%m/%Y,%H:%M:%S' + t[t.index(',',t.index(',')+1):]
print datetime.strptime(t, fmt)
或者使用字符串切片和静态格式字符串,
for t in l:
print datetime.strptime(t[:t.find(',',t.find(',')+1)],'%d/%m/%Y,%H:%M:%S')
2013-04-0900:00:00
2013-04-10 00:00:00
看看 datetime-glob,这是我们开发的用于从文件列表中解析 date/times 的模块。您可以使用 datetime_glob.PatternSegment
来解析任意字符串:
>>> import datetime_glob
>>> patseg = datetime_glob.parse_pattern_segment('%-d/%-m/%Y,%H:%M:%S*')
>>> match = datetime_glob.match_segment('9/4/2013,01:02:03,7.8,7.4,9.53',
patseg)
>>> match.as_datetime()
datetime.datetime(2013, 4, 9, 1, 2, 3)
也使用正则表达式,因为 python datetime
不允许忽略字符,此版本使用非捕获组(抱歉,该示例与您的问题无关):
import datetime, re
date_re = re.compile(r'([^.]+)(?:\.[0-9]+) (\+[0-9]+)')
date_str = "2018-09-06 04:15:18.334232115 +0000"
date_str = " ".join(date_re.search(date_str).groups())
date_obj = datetime.datetime.strptime(date_str, "%Y-%m-%d %H:%M:%S %z")
像@marjin 建议的那样使用正则表达式要好得多,这样你的代码更易于理解和更新。