如何对 python 中的日期进行排序?

How to sort date in python?

我试图对列表中的日期进行排序,但日期出现在字符串元素 [EQUIP-X] 之后。首先使用正则表达式,取唯一的日期并尝试排序。它不起作用!

我想拆分字符串 [EQUIP-X]Date

files = [filename for root, dirs, files in os.walk(path) for filename in files for date in dateList if filename.endswith(date+".log")]
for item in files:
 reg = re.search(r"(.+]).(\d{2}.\d{2}.\d{4})",item)
 equip = reg.group(1)
 data = reg.group(2)
 namefile = data+'.'+equip 
 print item

示例字符串:

[EQUIP-4].02.05.2019.log
[EQUIP-2].01.05.2019.log
[EQUIP-1].30.04.2019.log
[EQUIP-3].29.04.2019.log
[EQUIP-1].01.05.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-3].30.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-2].02.05.2019.log

在这个 tutorial 之后,'str' 对象没有属性 'sort',一旦我不是在操纵 'date' 而是 'str'。更好的方法是什么?这个想法是拆分和处理日期,然后加入所有

您可以只根据字符串的结尾减去解析为日期的最后 4 个字符(文件扩展名)进行排序。由于日期格式是零填充的,因此它的长度应始终为 10 个字符,因此字符串拼接从 -14 开始(10 表示日期 + 4 表示扩展名)

from datetime import datetime

files = ['[EQUIP-4].02.05.2019.log',
'[EQUIP-2].01.05.2019.log',
'[EQUIP-1].30.04.2019.log',
'[EQUIP-3].29.04.2019.log',
'[EQUIP-1].01.05.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-3].30.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-2].02.05.2019.log']

files.sort(key=lambda x: datetime.strptime(x[-14:-4], '%d.%m.%Y'))
print(files)
['[EQUIP-3].29.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-1].29.04.2019.log',
'[EQUIP-1].30.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-5].30.04.2019.log',
'[EQUIP-3].30.04.2019.log',
'[EQUIP-2].01.05.2019.log',
'[EQUIP-1].01.05.2019.log',
'[EQUIP-4].02.05.2019.log',
'[EQUIP-2].02.05.2019.log']

python sort 函数有一个 key 参数,可让您在排序前修改元素。

此示例从字符串末尾提取数字并按其排序。

a = ['hello 123', 'pumpkin 542', 'muffin 342']

def get_important_part(string):
    return int(string.split()[1])

print(sorted(a, key=get_important_part))

returns

['hello 123', 'muffin 342', 'pumpkin 542']

为什么不使用 strptimestrftime

dates = ['02.05.2019', '20.05.2019', '11.05.2019', '30.05.2019', '08.05.2019', '09.05.2019']
dates_obj = [datetime.strptime(x,'%d.%m.%Y') for x in dates]
dates_sorted = sorted(dates_obj)
dates_sorted = [x.strftime('%d.%m.%Y') for x in dates_sorted]
print (dates_sorted)

['02/05/2019', '08/05/2019', '09/05/2019', '11/05/2019', '20/05/2019', '30/05/2019']

您可以使用内置的 list sort() 函数对文件名进行排序,如下所示:

from datetime import datetime
import os  # Even though not used in example code.
from pprint import pprint
import re

#files = [filename for root, dirs, files in os.walk(path) for filename in files for date in dateList if filename.endswith(date+".log")]
files = [
    '[EQUIP-4].02.05.2019.log',
    '[EQUIP-2].01.05.2019.log',
    '[EQUIP-1].30.04.2019.log',
    '[EQUIP-3].29.04.2019.log',
    '[EQUIP-1].01.05.2019.log',
    '[EQUIP-5].30.04.2019.log',
    '[EQUIP-1].29.04.2019.log',
    '[EQUIP-5].30.04.2019.log',
    '[EQUIP-3].30.04.2019.log',
    '[EQUIP-1].29.04.2019.log',
    '[EQUIP-2].02.05.2019.log',
]

def get_date(filename):
    match = re.search(r".+].(\d{2}.\d{2}.\d{4})",filename)
    date_str = match.group(1)
    return datetime.strptime(date_str, '%d.%m.%Y')

files.sort(key=get_date)

pprint(files)

输出:

['[EQUIP-3].29.04.2019.log',
 '[EQUIP-1].29.04.2019.log',
 '[EQUIP-1].29.04.2019.log',
 '[EQUIP-1].30.04.2019.log',
 '[EQUIP-5].30.04.2019.log',
 '[EQUIP-5].30.04.2019.log',
 '[EQUIP-3].30.04.2019.log',
 '[EQUIP-2].01.05.2019.log',
 '[EQUIP-1].01.05.2019.log',
 '[EQUIP-4].02.05.2019.log',
 '[EQUIP-2].02.05.2019.log']

您可以将列表转换为熊猫数据框,然后进行相应的排序。按年、月和日排序,然后将索引转换为列表。然后按索引 (iloc) 显示排序后的值。

import pandas as pd
df = pd.DataFrame([('[EQUIP-4].02.05.2019.log')
,('[EQUIP-2].01.05.2019.log')
,('[EQUIP-1].30.04.2019.log')
,('[EQUIP-3].29.04.2019.log')
,('[EQUIP-1].01.05.2019.log')
,('[EQUIP-5].30.04.2019.log')
,('[EQUIP-1].29.04.2019.log')
,('[EQUIP-5].30.04.2019.log')
,('[EQUIP-3].30.04.2019.log')
,('[EQUIP-1].29.04.2019.log')
,('[EQUIP-2].02.05.2019.log')], columns = ['file'])

df.iloc[df['file'] \
      .map(lambda x: pd.to_datetime(x[-14:-4])) \
      .sort_values() \
      .index \
      .tolist()]

结果:

                 file
1   [EQUIP-2].01.05.2019.log
4   [EQUIP-1].01.05.2019.log
0   [EQUIP-4].02.05.2019.log
10  [EQUIP-2].02.05.2019.log
3   [EQUIP-3].29.04.2019.log
6   [EQUIP-1].29.04.2019.log
9   [EQUIP-1].29.04.2019.log
2   [EQUIP-1].30.04.2019.log
5   [EQUIP-5].30.04.2019.log
7   [EQUIP-5].30.04.2019.log
8   [EQUIP-3].30.04.2019.log

结合@ddg和@Sayse的建议,你可以试试:

import re
from datetime import datetime

files = ["[EQUIP-4].02.05.2019.log", ...]

files.sort(key = lambda item: datetime.strptime(re.search(r"(?=.)(\d{2}.\d{2}.\d{4})(?=.)", item).group(0), '%d.%m.%Y'), reverse=False)

或更易读的方式:

def getSortValue(item):
  reg = re.search(r"(?=.)(\d{2}.\d{2}.\d{4})(?=.)", item)
  data = reg.group(0)
  return datetime.strptime(data, '%d.%m.%Y')

files.sort(key = getSortValue, reverse = False)

输出:

print('\n'.join(files))

[EQUIP-3].29.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-1].29.04.2019.log
[EQUIP-1].30.04.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-5].30.04.2019.log
[EQUIP-3].30.04.2019.log
[EQUIP-2].01.05.2019.log
[EQUIP-1].01.05.2019.log
[EQUIP-4].02.05.2019.log
[EQUIP-2].02.05.2019.log