Python如何从给定日期字符串列表中筛选出过去365天内的日期
最高效解法思路
整个过程只需要一次遍历,时间复杂度为O(n),无多余中间变量占用内存,是理论最优的实现方案:
- 提前仅计算1次截止阈值:即当前日期减去365天的日期,避免重复运算
- 遍历日期字符串列表,逐行转换为日期格式后直接和阈值比较,符合条件的直接保留
实现代码
from datetime import datetime, timedelta strings = ['Nov 1 2021', 'Oct 25 2021', 'Oct 18 2021', 'Oct 11 2021', 'Oct 4 2021', 'Sep 27 2021', 'Sep 20 2021', 'Aug 24 2021', 'Aug 16 2021', 'Aug 9 2021', 'Aug 2 2021', 'Jul 26 2021', 'Jun 28 2021', 'Jun 21 2021', 'Jun 14 2021', 'Jun 7 2021', 'May 24 2021', 'May 10 2021', 'May 3 2021', 'Apr 26 2021', 'Apr 12 2021', 'Apr 12 2021', 'Apr 5 2021', 'Mar 22 2021', 'Feb 22 2021', 'Feb 13 2021', 'Feb 8 2021', 'Feb 1 2021', 'Nov 2 2020', 'Sep 28 2020', 'Aug 31 2020', 'Aug 20 2020', 'Aug 10 2020', 'Jun 29 2020', 'Jun 22 2020', 'Jun 15 2020', 'Mar 2 2020', 'Feb 10 2020', 'Feb 3 2020', 'Jan 27 2020', 'Jan 20 2020', 'Jan 13 2020', 'Jan 6 2020', 'Aug 26 2019', 'Aug 5 2019', 'Jul 29 2019', 'Jul 22 2019', 'Jul 15 2019'] # 计算截止日期,仅需执行1次 cutoff = datetime.today().date() - timedelta(days=365) # 如果需要固定以你示例中的2021年11月11日作为"今天",替换上面一行为: # cutoff = datetime(2021,11,11).date() - timedelta(days=365) # 列表推导式一步完成筛选,返回原格式字符串结果 result = [s for s in strings if datetime.strptime(s, "%b %d %Y").date() >= cutoff] # 如果需要返回datetime格式的结果,替换为下面的写法即可 # result = [datetime.strptime(s, "%b %d %Y").date() for s in strings if datetime.strptime(s, "%b %d %Y").date() >= cutoff]
超大规模数据的优化方案
如果要处理十万级以上的日期字符串,可使用pandas向量化运算,性能比纯Python遍历高3~5倍:
import pandas as pd cutoff = pd.Timestamp.today() - pd.Timedelta(days=365) result = pd.Series(strings)[pd.to_datetime(pd.Series(strings), format="%b %d %Y") >= cutoff].tolist()
原有代码的问题说明
- 重复计算当前日期:在
dateDelta函数中每次调用都重新计算当前日期,完全没有必要 - 多余的中间变量:创建了
dates、elapsed_time、date_and_elapsed_time等多个中间列表,既占用内存又增加了不必要的遍历次数 - 索引匹配逻辑冗余:不需要通过差值找索引反向匹配,第一次转换日期的时候就可以直接判断是否符合条件,一步完成筛选
内容的提问来源于stack exchange,提问作者Mikey
相关产品推荐
相关产品推荐

