如何移除DataFrame中首小时非0的对应完整日期数据?
处理Datetime索引DataFrame的日期过滤需求
你原来的代码有两个关键问题:
- 判断条件错误:应该检查小时是否为0,而非
day !=0(day是日期的日份,比如1号、2号,永远不会是0) - 删除范围错误:
df.drop(first_data)只能删掉指定的单条记录,无法删除整个日期的所有数据
正确的做法是先找出所有「当天首个记录不是0点」的日期,再批量删除这些日期的全部数据,代码如下:
# 1. 按日期分组,获取每个日期最早记录的小时数 daily_first_hour = df.index.groupby(df.index.date).min().hour # 2. 筛选出需要删除的日期:最早小时≠0的日期 dates_to_drop = daily_first_hour[daily_first_hour != 0].index # 3. 保留不属于这些日期的所有数据(等价于删除目标日期数据) df = df[~df.index.date.isin(dates_to_drop)]
如果一定要用df.drop()实现,也可以这样写:
# 获取所有需要删除的行的索引 rows_to_drop = df[df.index.date.isin(dates_to_drop)].index # 批量删除这些行 df = df.drop(rows_to_drop)
关键逻辑说明
df.index.date会把Datetime索引转换成纯日期对象(比如2017-01-01),方便按天分组处理groupby(df.index.date).min()能拿到每个日期的第一条记录的时间,再取.hour就知道当天第一条是几点- 用
isin匹配需要删除的日期,取反符号~用来保留符合要求的行(当天第一条是0点的日期)
内容的提问来源于stack exchange,提问作者Murilo
相关产品推荐
相关产品推荐

