datetime strptime - 设置格式以忽略字符串的尾随部分

时间:2015-03-26 17:16:41

标签: python string parsing datetime trailing

我有一个可变长度的字符串,我想给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)之类的事情,但我不想诉诸于用户相关问题。

4 个答案:

答案 0 :(得分:16)

你不能让datetime.strptime()忽略部分输入。 only 选项实际上是首先拆分额外的文本。

是的,你必须拆分并重新加入你的字符串:

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)

答案 1 :(得分:2)

要构建格式字符串而不拆分时间字符串并丢弃额外的文本,只需在格式字符串中包含额外的文本。 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-09 00:00:00
2013-04-10 00:00:00

答案 2 :(得分:1)

查看datetime-glob,我们开发的模块,用于从文件列表中解析日期/时间。您可以使用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)

答案 3 :(得分:0)

也使用正则表达式,因为python datetime不允许忽略char,此版本使用不捕获组(对不起,该示例与您的问题无关):

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建议的那样使用regexp更好,因此您的代码更易于理解且易于更新。