Python:如何根据日期和时间对字符串值列表进行排序?

2024-09-27 00:11:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我的清单是这样的

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>

我希望这是排序的日期和时间中给出的名称,但也保留全名。 我希望它按日期排序,然后按时间升序排序


Tags: or名称datetime排序格式时间random
3条回答

首先需要从字符串中提取日期部分。由于日期包含0填充数字(例如01而不是1),因此它始终是16位数字。要处理第一个数字的未知长度,您可以使用类似^\d{1,2}__([\d\-\s]{16})的正则表达式模式,它匹配一个1位或2位数字,然后是两个下划线,然后是一个16个字符的日期,在捕获组1中捕获日期,或者您可以执行以下操作:

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

import datetime

format = '%d-%m-%Y %H-%M'
print(datetime.datetime.strptime('01-11-2020 12-15', format))

datetime对象是可以比较的,因此使用这些对象作为键对列表进行排序将实现您想要的功能,即使用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'

希望这个对你有帮助。谢谢

相关问题 更多 >

    热门问题