You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
]

优化点说明

  1. 方法一直接基于现有数据统计,避免额外的日期计算,效率更高,适合数据量较大的场景;
  2. 先对日期去重(unique())能大幅减少后续分组计算的开销;
  3. 利用pandas的dt.isocalendar()原生方法处理ISO周,比手动计算更准确可靠。

内容的提问来源于stack exchange,提问作者Mainland

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:12:30