Python DataFrame高效筛选含完整7天ISO首周数据的方法
高效筛选ISO首周有完整7天数据的年份
方法一:基于数据存在性的快速筛选(推荐)
先对日期去重减少计算量,再通过ISO周和年份分组统计,直接筛选出有7天数据的年份:
import pandas as pd # 假设你的DataFrame日期是索引,若为列则替换为df['date'] unique_dates = df.index.unique() date_info = pd.DataFrame({"date": unique_dates}) # 提取ISO年份和周数 date_info["iso_year"] = date_info["date"].dt.isocalendar().year date_info["iso_week"] = date_info["date"].dt.isocalendar().week # 筛选ISO周为1的记录,按年份分组统计天数,保留天数为7的年份 valid_years = ( date_info[date_info["iso_week"] == 1] .groupby("iso_year")["date"] .count() .loc[lambda x: x == 7] .index.tolist() ) # 最终筛选符合条件的首周数据 filtered_df = df[ (df.index.isocalendar().year.isin(valid_years)) & (df.index.isocalendar().week == 1) ]
方法二:先判断年份本身的ISO首周完整性
如果你需要先确认年份的ISO首周本身是7天全在当年,再筛选对应数据,可以用这个方法:
def has_full_iso_week1(year): # 定位该年份ISO周1的起始日 first_day = pd.to_datetime(f"{year}-01-01") # 找到属于该年份ISO周1的第一个日期 while first_day.isocalendar().week != 1 or first_day.isocalendar().year != year: first_day += pd.Timedelta(days=1) # 检查ISO周1的最后一天是否仍在当年 return (first_day + pd.Timedelta(days=6)).year == year # 获取数据中涉及的所有年份 all_years = df.index.year.unique() # 筛选符合ISO首周完整的年份 valid_years = [y for y in all_years if has_full_iso_week1(y)] # 筛选对应年份的首周数据 filtered_df = df[ (df.index.isocalendar().year.isin(valid_years)) & (df.index.isocalendar().week == 1) ]
优化点说明
- 方法一直接基于现有数据统计,避免额外的日期计算,效率更高,适合数据量较大的场景;
- 先对日期去重(
unique())能大幅减少后续分组计算的开销; - 利用pandas的
dt.isocalendar()原生方法处理ISO周,比手动计算更准确可靠。
内容的提问来源于stack exchange,提问作者Mainland
相关产品推荐
相关产品推荐

