如何用pandas drop_duplicates保留距整点最近的重复站点记录
解决方法:删除重复站点记录并保留离整点最近的观测值
针对你遇到的这个气象站观测数据去重需求,我来分享两种简洁的实现方法,都能精准保留每个站点离目标整点(2020-05-31 23:00:00)最近的观测记录——比如你例子里的SUMU站点,最终会保留第7行、删除第3行。
步骤1:确保时间列是datetime类型
首先得把refTime列转换成datetime格式,这样才能正确计算时间差:
import pandas as pd # 转换时间列为datetime类型 df['refTime'] = pd.to_datetime(df['refTime'])
步骤2:计算每条记录与目标整点的时间差绝对值
我们先定义目标整点,再计算每条记录到这个时间的时间差绝对值(转成分钟更直观):
# 设定目标整点 target_time = pd.to_datetime('2020-05-31 23:00:00') # 计算时间差绝对值(单位:分钟) df['time_diff_min'] = abs((df['refTime'] - target_time).dt.total_seconds() / 60)
拿你例子里的SUMU站点来说:
- 第3行的时间是
22:47:00,和23:00的时间差是13分钟 - 第7行的时间是
22:59:00,时间差仅1分钟,所以这条会被保留
方法一:分组筛选时间差最小的记录
通过groupby分组后,用idxmin找到每个站点中时间差最小的行索引,再提取这些行:
# 按站点名称分组,获取每组时间差最小的行的索引 keep_indices = df.groupby('name')['time_diff_min'].idxmin() # 筛选出需要保留的记录,并移除临时的时间差列 filtered_df = df.loc[keep_indices].drop(columns='time_diff_min')
方法二:排序后去重
也可以先按站点名称和时间差升序排序,再用drop_duplicates保留每个站点的第一条记录:
# 按站点名称分组,再按时间差从小到大排序 sorted_df = df.sort_values(by=['name', 'time_diff_min']) # 保留每个站点的第一条记录,移除临时列 filtered_df = sorted_df.drop_duplicates(subset='name', keep='first').drop(columns='time_diff_min')
两种方法都能达到你的需求,最终的filtered_df里就不会有重复的站点,且每个站点都是离23:00最近的那条观测数据。
内容的提问来源于stack exchange,提问作者user2186862
相关产品推荐
相关产品推荐

