如何基于Datetime Index删除Pandas DataFrame指定月份的多行数据
如何通用删除Pandas DataFrame中指定月份的行?
我有一个带有Datetime Index的Pandas DataFrame,包含4月和5月的数据(原始DataFrame包含更多列)。希望删除5月的所有行(索引范围为2022-05-01 00:00:00至2022-05-31 23:45:00)。目前通过硬编码索引标签实现,但想要更通用的方法,无需硬编码日期,以便数据变更或需删除其他月份时无需修改代码。
现有硬编码代码:
start_remove = pd.to_datetime('2022-05-01 00:00:00') end_remove = pd.to_datetime('2022-05-31 23:45:00') df = df.loc[(df.index < start_remove) | (df.index > end_remove)]
样本数据集:
date Open Close High Low ... 2022-04-30 23:30:00 10 11.4 10.2 10.7 2022-04-30 23:45:00 18 17.2 17.2 15.8 2022-05-01 00:00:00 24 24 24.8 24.8 2022-05-01 00:15:00 59 58 60 60.3 2022-05-01 00:30:00 43.7 43.9 48 48 ... ... 2022-05-31 23:45:00 41.7 53.9 51 50
通用解决方案
方法1:直接通过月份属性过滤
利用Datetime Index自带的month和year属性,直接筛选出非目标月份的行,无需硬编码具体日期:
# 删除2022年5月的所有行 df = df[~((df.index.year == 2022) & (df.index.month == 5))]
如果不需要限制年份(删除所有年份的5月数据),可以简化:
df = df[df.index.month != 5]
方法2:封装为可复用函数
如果需要频繁处理不同月份,写一个函数来复用逻辑:
def drop_month_data(df, year, month): return df[~((df.index.year == year) & (df.index.month == month))] # 调用示例:删除2022年5月数据 df = drop_month_data(df, 2022, 5)
方法3:精确控制月份首尾时刻
如果需要像原代码那样精确到月份最后一天的23:45,可以用pd.Period生成月份范围,再自定义结束时间:
# 指定目标月份 target_month = pd.Period('2022-05', freq='M') start_remove = target_month.start_time # 设定当月最后一天的23:45为结束时间 end_remove = target_month.end_time.replace(hour=23, minute=45) df = df.loc[(df.index < start_remove) | (df.index > end_remove)]
这样只需修改target_month的参数(如'2023-06'),就能快速切换要删除的月份,无需手动写死日期。
内容的提问来源于stack exchange,提问作者A Newbie
相关产品推荐
相关产品推荐

