筛选含日期的字符串列表,提取其中所有对应星期日的日期
筛选文件路径中星期日日期的其他实现方案
现有待处理的字符串列表如下,所有元素均为年/月/日/文件名格式的路径:
['2021/08/01/EUR_USD.json', '2021/08/02/EUR_USD.json', '2021/08/03/EUR_USD.json', '2021/08/04/EUR_USD.json', '2021/08/05/EUR_USD.json', '2021/08/06/EUR_USD.json', '2021/08/08/EUR_USD.json', '2021/08/09/EUR_USD.json', '2021/08/10/EUR_USD.json', '2021/08/11/EUR_USD.json', '2021/08/12/EUR_USD.json', '2021/08/13/EUR_USD.json', '2021/08/15/EUR_USD.json']
需求为筛选上述列表中路径对应日期为星期日的条目,返回YYYY-MM-DD格式的日期列表,以下是不同实现方案:
方案1:基础循环优化版
优化了原有列表推导式里重复split+join的冗余操作,同时用isoweekday替代weekday,判断逻辑更直观(isoweekday返回值1对应周一、7对应周日,避免记错取值范围):
from datetime import datetime def dayOfWeek(l): res = [] for path in l: # 所有路径前10位固定为YYYY/MM/DD格式,直接截取即可 raw_date = path[:10] date_obj = datetime.strptime(raw_date, '%Y/%m/%d') if date_obj.isoweekday() == 7: # 直接转成要求的横杠分隔格式 res.append(date_obj.strftime('%Y-%m-%d')) return res
方案2:pandas向量化处理版
适合待处理路径量级较大的场景,向量化操作比普通Python循环效率高很多:
import pandas as pd def dayOfWeek(l): # 批量提取日期部分并转成日期类型 date_s = pd.Series(l).str[:10] date_s = pd.to_datetime(date_s, format='%Y/%m/%d') # 筛选星期日(pandas的weekday规则为0=周一、6=周日) sunday_dates = date_s[date_s.dt.weekday == 6] # 转成目标字符串格式后返回列表 return sunday_dates.dt.strftime('%Y-%m-%d').tolist()
方案3:连续日期场景专用版
如果你的路径是按天连续生成的,只要找到第一个星期日之后每隔7天就是下一个星期日,不需要每次都解析日期,性能最高:
from datetime import datetime, timedelta def dayOfWeek(l): res = [] first_sunday = None interval = timedelta(days=7) for path in l: raw_date = path[:10] date_obj = datetime.strptime(raw_date, '%Y/%m/%d') if not first_sunday: if date_obj.weekday() == 6: res.append(date_obj.strftime('%Y-%m-%d')) first_sunday = date_obj else: if date_obj == first_sunday + interval: res.append(date_obj.strftime('%Y-%m-%d')) first_sunday = date_obj return res
以上三种方案返回结果均为:['2021-08-01', '2021-08-08', '2021-08-15'],和你现有实现的输出一致。
内容的提问来源于stack exchange,提问作者nipy
相关产品推荐
相关产品推荐

