2024-09-27 00:11:26 发布
网友
我的清单是这样的
list1 = ['3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais', '3__01-09-1990 02-34 dfsdweis']
格式为<random 1 or 2 digit>__<date> <time> <random characters>
<random 1 or 2 digit>__<date> <time> <random characters>
我希望这是排序的日期和时间中给出的名称,但也保留全名。 我希望它按日期排序,然后按时间升序排序
首先需要从字符串中提取日期部分。由于日期包含0填充数字(例如01而不是1),因此它始终是16位数字。要处理第一个数字的未知长度,您可以使用类似^\d{1,2}__([\d\-\s]{16})的正则表达式模式,它匹配一个1位或2位数字,然后是两个下划线,然后是一个16个字符的日期,在捕获组1中捕获日期,或者您可以执行以下操作:
01
1
^\d{1,2}__([\d\-\s]{16})
i = line.index('_') + 2 print(line[i:i+16])
无论哪种方式,现在都有了时间字符串,例如01-11-2020 12-15。现在,您可以使用strptime函数解析它以获得datetime对象。(有关如何构造适当的格式字符串,请参见https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior。)
01-11-2020 12-15
strptime
datetime
import datetime format = '%d-%m-%Y %H-%M' print(datetime.datetime.strptime('01-11-2020 12-15', format))
datetime对象是可以比较的,因此使用这些对象作为键对列表进行排序将实现您想要的功能,即使用sorted(list1, key=...)
sorted(list1, key=...)
以下是完整的代码:
import re import datetime extract_time_pattern = re.compile(r'^\d{1,2}__([\d\-\s]{16})') def extract_datetime(line:str): # i = line.index('_') + 2 # time_string = line[i:i+16] time_string = extract_time_pattern.match(line).group(1) format = '%d-%m-%Y %H-%M' return datetime.datetime.strptime(time_string, format) list1 = ['3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais', '3__01-09-1990 02-34 dfsdweis'] print(sorted(list1, key=extract_datetime))
有几种方法可以做到这一点,我坚持使用标准库
我选择regex获取日期和时间值,然后解析它们以创建相关对象:
import re from datetime import datetime import time list1 = ['3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais', '3__01-09-1990 02-34 dfsdweis'] c = re.compile(r'(?<=__)(.+?) (\d+-\d+)') def sorter_fn(item): d, t = c.findall(item)[0] date_ = datetime.strptime(d, '%d-%m-%Y') time_ = time.strptime(t, '%H-%M') return date_, time_ list1.sort(key=sorter_fn) print(list1)
输出:
['3__01-09-1990 02-34 dfsdweis', '3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais']
请试试这个
导入必要的软件包
import pandas as pd
准备测试数据
test_list = ['3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais', '3__01-09-1990 02-34 dfsdweis']
定义从输入字符串提取日期的函数
def extract_date(str): start = str.rindex('_') + 1 end = str.rindex(' ') return str[start:end]
按日期对列表排序&;时间
sorted_list = sorted(list1, key=lambda x: pd.datetime.strptime(f'{extract_date(x)}', '%d-%m-%Y %H-%M'))
结果
'3__01-09-1990 02-34 dfsdweis', '3__01-11-2020 12-15 asiudhais', '12__04-11-2020 01-10 dgsisdwrais'
希望这个对你有帮助。谢谢
首先需要从字符串中提取日期部分。由于日期包含0填充数字(例如
01
而不是1
),因此它始终是16位数字。要处理第一个数字的未知长度,您可以使用类似^\d{1,2}__([\d\-\s]{16})
的正则表达式模式,它匹配一个1位或2位数字,然后是两个下划线,然后是一个16个字符的日期,在捕获组1中捕获日期,或者您可以执行以下操作:无论哪种方式,现在都有了时间字符串,例如
01-11-2020 12-15
。现在,您可以使用strptime
函数解析它以获得datetime
对象。(有关如何构造适当的格式字符串,请参见https://docs.python.org/3/library/datetime.html#strftime-strptime-behavior。)datetime
对象是可以比较的,因此使用这些对象作为键对列表进行排序将实现您想要的功能,即使用sorted(list1, key=...)
以下是完整的代码:
有几种方法可以做到这一点,我坚持使用标准库
我选择regex获取日期和时间值,然后解析它们以创建相关对象:
输出:
请试试这个
导入必要的软件包
准备测试数据
定义从输入字符串提取日期的函数
按日期对列表排序&;时间
结果
希望这个对你有帮助。谢谢
相关问题 更多 >
编程相关推荐