如何从含2年数据的DataFrame中移除最近2个月记录?
解决你的Pandas数据处理问题
咱们先梳理下你的需求:给包含2年数据的DataFrame按日期排序,然后移除最近2个月的记录。你的代码出现报错,主要是逻辑和方法使用上出了点小问题,我来一步步帮你搞定。
先搞清楚错误原因
你写的代码df.index = pd.DatetimeIndex(df.pop('Ship_Date')) df.sort_index().last('2M').drop()有两个核心问题:
drop()方法参数缺失:drop()必须指定要删除的标签、列或者轴,直接空调用肯定会抛出错误;- 逻辑搞反了:你是先提取了最近2个月的数据再尝试删除,但这时候操作的是这个子集,不是原数据,而且你的需求是移除最近2个月,应该保留更早的数据才对。
正确的处理步骤
步骤1:规范设置日期索引并排序
首先确保Ship_Date列是标准的日期类型,然后把它设为索引并排序:
# 先将Ship_Date转换为datetime类型(如果数据原本是字符串格式的话) df['Ship_Date'] = pd.to_datetime(df['Ship_Date']) # 设置为索引并按日期排序 df = df.set_index('Ship_Date').sort_index()
这里用set_index比pop更稳妥,因为pop会直接把Ship_Date列从DataFrame中移除,而set_index只是把它作为索引保留,后续如果需要还能通过reset_index()恢复成列。
步骤2:移除最近2个月的记录
要精准移除最近2个月的数据,我们可以先计算一个截止日期,然后筛选出早于这个日期的记录:
# 计算截止日期:最新日期往前推2个月 cutoff_date = df.index.max() - pd.DateOffset(months=2) # 筛选出早于截止日期的所有数据,也就是移除了最近2个月的记录 filtered_df = df[df.index < cutoff_date]
另一种简洁写法
如果你喜欢更简洁的方式,也可以用iloc结合last()来定位要删除的部分:
# 先排序,然后取除了最后2个月之外的所有数据 filtered_df = df.sort_index().iloc[:-df.last('2M').shape[0]]
验证效果
假设你数据里的最新日期是2019-10-29,那截止日期就是2019-08-29,筛选后的数据会包含所有2019-08-29之前的记录,完美符合你移除最近2个月数据的需求。
内容的提问来源于stack exchange,提问作者newbie pandas
相关产品推荐
相关产品推荐

