Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.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 datetime strTime-设置忽略字符串尾部的格式_Python_String_Parsing_Datetime_Trailing - Fatal编程技术网

Python datetime strTime-设置忽略字符串尾部的格式

Python datetime strTime-设置忽略字符串尾部的格式,python,string,parsing,datetime,trailing,Python,String,Parsing,Datetime,Trailing,我有一个长度可变的字符串,我想为strtime提供一种格式,以便忽略该字符串的其余部分。让我举例说明。我有点像 9/4/2013,00:00:00,7.8,7.4,9.53 10/4/2013,00:00:00,8.64,7.4,9.53 我需要一种格式,使命令strtime(line,format)能够读取这些行。类似于格式=“%d/%m/%Y,%H:%m:%S*”,尽管我知道这不起作用。我想我的问题有点类似于,但没有答案可以帮助我,我的问题更糟,因为我的字符串的全长可能会有所不同。我有一种

我有一个长度可变的字符串,我想为
strtime
提供一种格式,以便忽略该字符串的其余部分。让我举例说明。我有点像

9/4/2013,00:00:00,7.8,7.4,9.53
10/4/2013,00:00:00,8.64,7.4,9.53
我需要一种格式,使命令
strtime(line,format)
能够读取这些行。类似于
格式=“%d/%m/%Y,%H:%m:%S*”
,尽管我知道这不起作用。我想我的问题有点类似于,但没有答案可以帮助我,我的问题更糟,因为我的字符串的全长可能会有所不同。我有一种感觉,
dateutil
可以解决我的问题,但我在那里找不到能解决问题的东西


我可能可以做一些像
strtime(''.join(line.split(',')[:2]),format)
,但我不想在与用户相关的问题上求助于它。

你不能让
datetime.strtime()
忽略部分输入。;你唯一的选择就是先把多余的文字分开

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

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-09 00:00:00
2013-04-10 00:00:00

我们开发了一个模块,用于解析文件列表中的日期/时间。您可以使用
datetime\u glob.patternsecute
解析任意字符串:

>>> 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)

使用regexp也是因为python
datetime
不允许忽略char,所以此版本使用no-capturing group(很抱歉,该示例与您的问题无关):


最好像@marjin建议的那样使用regexp,这样您的代码更容易理解和更新

OP不想分割多余的文本。他想要一个格式字符串来读取字符串。@NizamMohamed:OP要求的是一些不存在的东西。我已经给出了解决方案。@NizamMohamed:不,事实上,你没有。您正在做完全相同的事情,但拆分了另一部分。这比它解决的问题还多,因为现在你还必须担心转义元字符。是的,不管怎样,你必须修改每个输入行,或者修改每个输入行的格式。太糟糕了。如果额外的字符串包含
%
个字符,会发生什么?请注意,您实际上是在反向进行拆分;您正在拆分余数并将其添加到格式字符串中。日期和时间字段中出现%的可能性为真。我回答了OP。是的,但我也回答了,但它没有你的“解决方案”所存在的问题。有时候,答案确实是你做不到,但以下是你如何解决问题的。什么问题?OP需要一个格式字符串。他已经知道拆分原始字符串。我已经注释过了,不,下行投票不需要注释。这可以归结为对strtime的增强请求,以允许任意正则表达式,至少在字符串的尾部:
format='%d/%m/%Y,%H:%m:%S.*
。这是一个共同的要求,值得考虑。事实上
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")