这是我理解的任务列表。
-
从文件名中提取字符串时间戳——字符串和列表处理
-
将时间戳(包括小时、分钟、秒)标准化为日期戳(仅限年-月-日)以在一天内对文档进行分组——日期处理
-
按每天的文档数量降序排序,然后在每天的文档数量范围内,按日期升序排序——稳定排序
-
在同一日期对文档进行分组,以某种方式处理它们——将函数传递给其他函数
这涵盖了 Python 编程中相当多的基础,所以我将在进行过程中进行解释。
我推荐使用 arrow 库来处理日期。
首先,安装箭头:
pip install arrow
import itertools
from collections import Counter
from pathlib import Path
import arrow
docs = [
'Tyler Cowen On Reading 202109200657.md',
'On Poems 202109210659.md',
'Slava Akhmechet On Reading In Clusters 202109200659.md',
'Ideation In A 4X4 Matrix 202109200717.md',
'Drawing Grid Ideation 202109220830.md',
'Dictation 201208251425.md',
]
def datestamp(filename):
basename = Path(filename).stem
date_as_string = basename.split()[-1]
timestamp = arrow.get(date_as_string, 'YYYYMMDDhhmm')
return timestamp.format('YYYYMMDD')
要从文件名中提取日期部分,您需要文档“基本名称”的最后一部分,在最后一个空格之后。
Python 的.split() 方法将字符串拆分为空白处的列表(空格、制表符等):
>>> basename = 'On Poems 202109210659'
>>> basename.split()
['On', 'Poems', '202109210659']
a_list[-1] 提取列表中的最后一项,因此:
>>> basename.split()[-1]
'202109210659'
获取文件基本名称中最后一个空格之后的所有内容——时间戳。
然后arrow 用于将时间戳转换为日期戳,以便忽略文档时间并将同一天的文档组合在一起。
202109210659 -> 20210921
使用箭头而不是正则表达式意味着您可以处理文件名中的不同日期格式。
在这种情况下,将日期排序为字符串是可行的,因为所有日期都是 YMD 格式,年份(最大的部分)后跟月份和日期。如果我们对 DMY 日期进行排序,我们会得到意想不到的(和不需要的)结果。
对于绘图数据:
datestamps = [datestamp(doc) for doc in docs]
datestamps.sort()
docDates = Counter()
for date in datestamps:
docDates[date] += 1
for date, doc_count in docDates.most_common():
print(f'{date},{doc_count}')
Counter() 是 Python 标准库中一个有用的类。
它的.most_common() 方法用于首先对文档最多的日期进行排序:
>>> python docs.py
20210920,3
20120825,1
20210921,1
20210922,1
请注意,1-doc 日期是按日期排序的二级。 datestamps.sort()(.most_common() 之前)是按日期排序的二级排序,因为 Python 库排序函数是“稳定的”。迭代 Counter() 遵循原始插入顺序,因此在文档计数相同的情况下,.most_common() 将保留 datestamps.sort() 的原始日期顺序。
为了更好地理解稳定排序,see this answer。您可能需要多走几遍才能理解它。
要对共享给定日期的文档进行分组,首先按 datestamp 函数对文档进行排序,然后按相同函数对它们进行分组。这使您可以处理与单个日期相关的所有文档(用于每日字数等)。为每个文件名计算日期戳“键”函数,然后用于在排序和分组时比较项目。
docs.sort(key=datestamp)
for date, docs_on_date in itertools.groupby(docs, key=datestamp):
docs_today = list(docs_on_date)
print(f'{date}: {docs_today}')
# for doc in docs_today:
# # do_something_with(doc)
结果:
20120825: ['Dictation 201208251425.md']
20210920: ['Tyler Cowen On Reading 202109200657.md', 'Slava Akhmechet On Reading In Clusters 202109200659.md', 'Ideation In A 4X4 Matrix 202109200717.md']
20210921: ['On Poems 202109210659.md']
20210922: ['Drawing Grid Ideation 202109220830.md']