如何对 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
- 组(1) - [EQUIP-X]
- 组(2) - 日期
示例字符串:
[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']
为什么不使用 strptime
和 strftime
?
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
我试图对列表中的日期进行排序,但日期出现在字符串元素 [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
- 组(1) - [EQUIP-X]
- 组(2) - 日期
示例字符串:
[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']
为什么不使用 strptime
和 strftime
?
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