You need to enable JavaScript to run this app. pandas按月日过滤DataFrame提取每年12月31日数据及问题解决
优惠活动
大模型
产品
解决方案
定价
更多

pandas按月日过滤DataFrame提取每年12月31日数据及问题解决

实现方法与报错修正

批量提取每年12月31日数据

要实现传入datetime列表的批量过滤,配合pandas内置isin()方法即可,不需要拼接长串的or判断:

  • 手动指定目标日期列表的写法
# 构造需要匹配的目标日期集合
target_dates = pd.to_datetime([
    "2016-12-31", "2017-12-31",
    "2018-12-31", "2019-12-31",
    "2020-12-31"
])
# 批量过滤匹配行
match_df = df.loc[df["timestamp"].isin(target_dates)]
  • 按月、日维度自动匹配的写法(无需逐年手动维护日期列表)
# 直接匹配所有月份为12、日期为31的行,自动覆盖数据范围内所有年份
match_df = df.loc[
    (df["timestamp"].dt.month == 12) &
    (df["timestamp"].dt.day == 31)
]

解决SettingWithCopyWarning报错

触发告警的核心原因是操作顺序错误:通过切片拿到的结果是原DataFrame的视图引用,不是独立的内存副本,直接在视图上执行inplace=True的修改就会触发安全告警。
修正方式:拿到切片结果的第一时间,调用.copy()生成独立副本,后续操作就不会触发告警。
修正后的完整可运行代码:

# 过滤目标行,立刻生成独立副本,从根源避免告警
year_end_supply = df.loc[
    (df["timestamp"].dt.month == 12) &
    (df["timestamp"].dt.day == 31)
].copy()

# 在独立副本上执行列删除操作
year_end_supply.drop(
    columns=["close", "issuance_native"],
    inplace=True
)

# 查看输出结果
year_end_supply.head()

如果需要将timestamp列调整为年-日-月的展示格式(匹配预期的2016-31-12样式),可追加格式化代码:

year_end_supply["timestamp"] = year_end_supply["timestamp"].dt.strftime("%Y-%d-%m")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.28 02:36:07