You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:37:36