python - 我有一个长字符串,其中包含多种格式的日期(dd-mm-yyyy、mm-dd-yyyy 等)。如何将它们全部转换为相同的格式?

标签 python regex string datetime parsing

我正在研究Python。我有很多长文本数据。每个文本都可以被视为一个字符串。在每个字符串中,我需要将字符串分成列表中存在日期的元素。

eg. long string1 (date format: mm.dd.yyyy): 

05.12.2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.13.2016 15:58:31  sdfasjdcakscsdv
01.14.2016fsdkjgfdhkvjxdbvxd

eg. long string2 (date format: dd/mm/yyyy): 

05/12/2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.1.2016 15:58:31  sdfasjdcakscsdv
21/11/2016fsdkjgfdhkvjxdbvxd

Step1: I need to write a generalized code such that I can pass both strings in the same code.

Step2: Objective of the code is to convert string into list with elements separated by date.

例如。长字符串 1 到列表 1 [05.12.2016 15:58:31 jsfkgskdlfsgfdslkcbj,05.13.2016 15:58:31 sdfasjdcakscsdv,01.14.2016fsdkjgfdhkvjxdbvxd]

Step 3: and then take the element with the earliest date

output from above example: 01.14.2016fsdkjgfdhkvjxdbvxd

我获得了执行步骤 2 和 3 的帮助,并且当所有字符串都具有相同的日期格式时我可以执行此操作。但我的挑战是首先读取一个字符串并找出它使用的日期格式,然后根据日期对其进行解析和排序

如果给出一种日期格式,我就有代码。

text = '05/12/2016 15:58:31 jsfkgskdlfsgfdslkcbj 05.1.2016 15:58:31  sdfasjdcakscsdv 21/11/2016fsdkjgfdhkvjxdbvxd'

list1 = list()
for d, t in zip(*[iter(re.split(r'(\d+[\/.]\d+[\/.]\d+ \d+:\d+:\d+)', text)[1:])]*2):
    list1.append(d + t)

from datetime import datetime
list_sorted=sorted(list1,key=lambda s: datetime.strptime(s[0:19], "%d.%m.%Y %H:%M:%S") if '.' in s[0:19] else datetime.strptime(s[0:19], "%d/%m/%Y %H:%M:%S"))

complaint = list_sorted[0]
print(complaint)

上面的代码适用于单个日期格式的单个字符串。如何将其概括为首先检测字符串中的日期格式,然后相应地解析它

最佳答案

您可以使用dateutil.parser存在于 dateutil模块可以为您解析日期时间字符串,无论格式如何

In [17]: from dateutil import parser                                                                                                                                                   

In [18]: parser.parse('05/12/2016 15:58:31', fuzzy=True)                                                                                                                                           
Out[18]: datetime.datetime(2016, 5, 12, 15, 58, 31)

In [19]: parser.parse('05.1.2016 15:58:31', fuzzy=True)                                                                                                                                            
Out[19]: datetime.datetime(2016, 5, 1, 15, 58, 31)

In [20]: parser.parse('21/11/2016', fuzzy=True)                                                                                                                                                    
Out[20]: datetime.datetime(2016, 11, 21, 0, 0)

或者另一个收集日期时间对象并根据它对原始列表进行排序的示例

from dateutil import parser

#List of textdate srings
textdate = ['5.13.2001 21:23:54 fgdsgd', '05.12.2001 09:43:32 arfehfks']

#Collect datetime objects
dates = []
for item in textdate:
    dates.append(parser.parse(item, fuzzy=True))

#Sort datetime objects and obtained original list on sorting
res = [textdate[i[0]] for i in sorted(enumerate(dates), key=lambda x:x[1])]
print(res)

输出将是

['05.12.2001 09:43:32 arfehfks', '5.13.2001 21:23:54 fgdsgd']

关于python - 我有一个长字符串,其中包含多种格式的日期(dd-mm-yyyy、mm-dd-yyyy 等)。如何将它们全部转换为相同的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56389743/

相关文章:

python - 在 Python App Engine API 中写入和读取 blobstore 文件以存储时间戳

python - 与我的 MYSQL connect_timeout 单位混淆

javascript - JavaScript 中平衡分隔符之间的正则表达式匹配内容

javascript - 主机地址的正则表达式?

arrays - swift 2.0 - 错误 : Immutable value of type '[String]' only has mutating members named 'append'

python - 如何检查给定的 Python 字符串是否是另一个字符串的子字符串?

python - 如何在 Travis-CI 上缓存 Django 项目的需求?

java - 使用 Java 正则表达式进行字符串操作

string - 围绕 Scala 字符串

java - 我希望将用户给定字符串的所有小写字母转换为 '#' 。但是在运行代码时,只有最后一个小写字符被转换