【问题标题】:Excel or R: Merge time series with missing values [duplicate]Excel或R:合并缺少值的时间序列[重复]
【发布时间】:2026-01-04 21:15:01
【问题描述】:

我有多个有点不规则的时间序列(每个都在一个 CSV 文件中),如下所示:

X.csv

date,time,value
01/01/04,00:15:00,4.98
01/01/04,00:25:00,4.981
01/01/04,00:35:00,4.983
01/01/04,00:55:00,4.986

等等:

Y.csv

date,time,value
01/01/04,00:05:00,9.023
01/01/04,00:15:00,9.022
01/01/04,00:35:00,9.02
01/01/04,00:45:00,9.02
01/01/04,00:55:00,9.019

请注意,这两个文件的粒度基本上都是 10 分钟,但每个文件都有一些缺失的条目。

我现在想合并这两个时间序列实现以下目标:

date,time,X,Y
01/01/04,00:05:00,NA,9.023
01/01/04,00:15:00,4.98,9.022
01/01/04,00:25:00,4.981,NA
01/01/04,00:35:00,4.983,9.02
01/01/04,00:45:00,NA,9.02
01/01/04,00:55:00,4.986,9.019

有没有简单的方法来实现这一点?由于我有多个文件(不仅仅是两个),有没有办法对一批文件执行此操作?

【问题讨论】:

    标签: r excel csv merge time-series


    【解决方案1】:

    获取您的数据:

    X <- read.table(pipe("pbpaste"), sep=",", header=T)
    X$date <- as.POSIXct(paste(as.Date(X$date, format='%m/%d/%y'),X$time))
    

    了解我们

    > X
                     date     time value
    1 2004-01-01 00:15:00 00:15:00 4.980
    2 2004-01-01 00:25:00 00:25:00 4.981
    3 2004-01-01 00:35:00 00:35:00 4.983
    4 2004-01-01 00:55:00 00:55:00 4.986
    

    与 Y 相同:

    > Y
                     date     time value
    1 2004-01-01 00:05:00 00:05:00 9.023
    2 2004-01-01 00:15:00 00:15:00 9.022
    3 2004-01-01 00:35:00 00:35:00 9.020
    4 2004-01-01 00:45:00 00:45:00 9.020
    5 2004-01-01 00:55:00 00:55:00 9.019
    

    现在将 X,Y 转换为 xts-objects 并将这 2 个对象与 outer join 合并以获取所有数据点。

    result <- merge(as.xts(X[,3],order.by = X$date),as.xts(Y[,3],order.by = Y$date),join='outer’)
    
    names(result) <- c('x','y')
    

    最后一步是按行求和:

    result$bothXY <- rowSums(result,na.rm=T)
    

    如果您不再需要 x,y 列:

    result <- result[,3]
    

    你会得到:

    > result
                        bothXY
    2004-01-01 00:05:00  9.023
    2004-01-01 00:15:00 14.002
    2004-01-01 00:25:00  4.981
    2004-01-01 00:35:00 14.003
    2004-01-01 00:45:00  9.020
    2004-01-01 00:55:00 14.005
    

    【讨论】:

      【解决方案2】:

      您可以使用 dplyr 来执行此操作。首先使用 do 循环从组 X 和组 Y 中读取所有文件,这样最终每个文件只有一个文件。然后 full_join 结果。

      【讨论】:

      • 请扩展您的答案,目前这看起来更像是评论。
      最近更新 更多