如何在Pandas中仅保留各小时最接近整点的行并删除其余行?
当然可以用Pandas搞定这个需求!我来一步步给你拆解实现步骤:
第一步:确保时间索引是datetime类型
首先得保证你的Date索引是Pandas的datetime格式——毕竟要做时间相关的分组和计算,格式不对会出问题。如果还没转换的话,先做这一步:
# 如果Date列还没设为索引,先设置 df = df.set_index('Date') # 转换为datetime类型(如果原始数据是字符串格式的话) df.index = pd.to_datetime(df.index)
第二步:按小时分组,筛选最接近整点的行
核心思路是:把数据按小时段分组(比如15:00-15:59为一组),然后在每个组里找出时间戳最接近该小时整点的那一行。
代码实现如下:
import pandas as pd # 定义一个辅助函数,处理单个小时组的筛选 def pick_closest_to_hour(group): # 计算每行时间到当前小时整点的时间差绝对值 # group.index.floor('H') 会得到该组对应的整点时间(比如15:16:12对应15:00:00) time_diff = (group.index - group.index.floor('H')).abs() # 返回时间差最小的那一行 return group.loc[time_diff.idxmin()] # 按小时分组,应用筛选函数 result_df = df.groupby(pd.Grouper(freq='H')).apply(pick_closest_to_hour) # 可选:移除分组产生的额外索引,让结果和原数据结构一致 result_df = result_df.reset_index(level=0, drop=True)
特殊情况:如果你需要保留每个小时段的最早行
看你例子里提到“删除该时段内所有时间戳晚于该行的其他行”,如果你的实际需求是保留每个小时里最早出现的那一行(而不是严格最接近整点),那代码可以更简洁:
# 按小时分组,直接取每个组的第一行 result_df = df.groupby(pd.Grouper(freq='H')).first()
验证结果
运行完上面的代码后,你可以打印result_df检查——每个小时只会保留一行,完全符合你的要求。
内容的提问来源于stack exchange,提问作者Jeff Saltfist
相关产品推荐
相关产品推荐

