R语言基于重复时间字段合并分散数据行的实现方法
时序重复行合并方案
需求本质
按时间字段分组,对每个分组内的其余列保留所有非空有效值,最终每个时间戳仅保留一行数据。
R语言实现方案
1. tidyverse 实现(易读性优先)
适合中小规模数据集,代码逻辑清晰:
library(tidyverse) # 示例数据构造 df <- tribble( ~date, ~P1, ~PT1, ~P2, ~PT2, ~P3, ~PT3, "5/5/2011 11:40", NA, NA, NA, NA, 9.4, 10.1, "5/5/2011 11:40", 5.6, 10.2, 8.5, 10.1, NA, NA ) # 合并逻辑 df_merged <- df %>% # 建议先将date转为时间类型,避免字符串分组误差 mutate(date = as.POSIXct(date, format = "%m/%d/%Y %H:%M")) %>% group_by(date) %>% # 对所有列取第一个非NA值 summarise(across(everything(), ~first(na.omit(.x))))
如果某列同时间戳下存在多个非NA值,可将first替换为max/min/mean等函数处理冲突。
2. data.table 实现(性能优先)
适合10年粒度的大规模时序数据,运算速度远快于tidyverse:
library(data.table) # 转为data.table对象 setDT(df) # 时间格式转换 df[, date := as.POSIXct(date, format = "%m/%d/%Y %H:%M")] # 按date分组,每列取第一个非NA值 df_merged <- df[, lapply(.SD, function(x) x[!is.na(x)][1]), by = date]
Python pandas 实现方案
import pandas as pd # 示例数据构造 df = pd.DataFrame([ ["5/5/2011 11:40", None, None, None, None, 9.4, 10.1], ["5/5/2011 11:40", 5.6, 10.2, 8.5, 10.1, None, None] ], columns=["date", "P1", "PT1", "P2", "PT2", "P3", "PT3"]) # 时间格式转换 df["date"] = pd.to_datetime(df["date"], format="%m/%d/%Y %H:%M") # 分组合并,自动跳过NA取第一个有效值 df_merged = df.groupby("date", as_index=False).first()
注意事项
- 提前将时间字段转为标准时间类型,避免因字符串空格、格式差异导致分组错误
- 若存在同时间同列多个非NA值的异常情况,可根据业务逻辑调整聚合函数
内容的提问来源于stack exchange,提问作者schultz45
相关产品推荐
相关产品推荐

