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
相关产品推荐
相关产品推荐

