<p>这是我理解的任务清单</p>
<ol>
<li><p>从文件名字符串和列表处理中提取字符串时间戳</p>
</li>
<li><p>将时间戳(包括小时、分钟、秒)标准化为日期戳(仅限年-月-日),以便在单日日期处理上对文档进行分组</p>
</li>
<li><p>按每天文档数降序排序,然后在每天文档数内按日期升序稳定排序</p>
</li>
<li><p>在同一日期对文档进行分组,以某种方式将函数传递给其他函数进行处理</p>
</li>
</ol>
<p>这涵盖了Python编程中相当多的基础知识,因此我将在接下来的过程中进行解释</p>
<p>我建议使用<code>arrow</code>库来处理日期。
首先,安装箭头:</p>
<p><code>pip install arrow</code></p>
<pre class="lang-py prettyprint-override"><code>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')
</code></pre>
<p>要从文件名中提取日期部分,您需要文档“基本名称”的最后一部分,位于最后一个空格之后</p>
<p>Python的<code>.split()</code>方法将字符串拆分为一个空白列表(空格、制表符等):</p>
<pre><code>>>> basename = 'On Poems 202109210659'
>>> basename.split()
['On', 'Poems', '202109210659']
</code></pre>
<p><code>a_list[-1]</code>提取列表中的最后一项,因此:</p>
<pre><code>
>>> basename.split()[-1]
'202109210659'
</code></pre>
<p>获取时间戳最后一个空格后文件的basename中的所有内容</p>
<p>然后<code>arrow</code>用于将时间戳转换为日期戳,因此忽略文档时间,并将当天的文档分组在一起</p>
<pre><code>202109210659 -> 20210921
</code></pre>
<p>使用arrow而不是regex意味着您可以处理文件名中的不同日期格式</p>
<p>在本例中,将日期排序为字符串是有效的,因为所有日期都采用YMD格式,年份(最大的部分)后跟月份和日期。如果我们对DMY日期进行排序,我们会得到意想不到的结果</p>
<p>对于Plotly数据:</p>
<pre><code>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}')
</code></pre>
<p><code>Counter()</code>是Python标准库中的一个有用类。
它的<code>.most_common()</code>方法用于首先对文档最多的日期进行排序:</p>
<pre><code>>>> python docs.py
20210920,3
20120825,1
20210921,1
20210922,1
</code></pre>
<p>请注意,1-doc日期是按日期排序的第二级日期。<code>datestamps.sort()</code>(在<code>.most_common()</code>之前)是第二级按日期排序,因为Python库排序函数是“稳定的”。在<code>Counter()</code>上迭代遵循原始插入顺序,因此<code>.most_common()</code>将在文档计数相同的情况下保留从<code>datestamps.sort()</code>开始的原始日期顺序</p>
<p>为了更好地理解稳定排序,<a href="https://softwareengineering.stackexchange.com/a/247441/347727">see this answer</a>。你可能需要花一些时间去理解它</p>
<p>要对共享给定日期的文档进行分组,请首先使用datestamp函数对文档进行排序,然后使用相同的函数对文档进行分组。这使您可以处理与单个日期相关的所有文档(用于每日字数统计等)。会为每个文件名计算datestamp“key”函数,然后在排序和分组时用于比较项目</p>
<pre><code>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)
</code></pre>
<p>结果:</p>
<pre><code>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']
</code></pre>