【问题标题】:R padding datetime data by groups based on another datetime variableR根据另一个日期时间变量按组填充日期时间数据
【发布时间】:2019-02-07 00:07:47
【问题描述】:

我有一个包含 POSIXct 日期时间 (t1) 数据的数据表,该数据按多列分组。我的数据应该有 48 行,每个组每隔半小时(总共 24 小时),其日期时间 (t1) 值由用作分组变量一部分的另一个日期时间 (t2) 变量确定。 48 行 (t1) 数据应该是 24 小时的半小时间隔,直到分组的日期时间 (t2)。

我需要用每个组的上一个(按时间顺序)完整数据行中的值填充缺失的行。

例如:如果按ID分组的数据=A,datetime(t2)=10-01-2019 06:00:00(格式='dd-mm-yyyy hh:mm: ss') 具有从 09-01-2019 08:00:0010-01-2019 04:00:00 的日期时间 (t1) 数据。它应该从 09-01-2019 06:00:0010-01-2019 05:30:00,这意味着 4 行数据(2 小时)是从一开始就缺失,从结尾缺失 3 行数据,并且在可用数据点之间也缺失了几行。虽然无法用完整数据填充在时间段开始时丢失的行,但我仍然希望将这些行作为 NA 添加到表中。但是,使用前一个完整数据行中的完整数据填充表末尾的行非常重要。

我的数据集示例如下所示:(按 ID 和 t2 分组)

ID t2                   t1                    varX   varY
... 
A  10-01-2019 06:00:00  10-01-2019 12:00:00   100    Y1 
A  10-01-2019 06:00:00  10-01-2019 12:30:00   60     Y2 
B  10-01-2019 06:00:00  10-01-2019 01:00:00   100    Y2 
A  10-01-2019 06:30:00  10-01-2019 01:30:00   100    Y3 
B  10-01-2019 06:30:00  10-01-2019 02:00:00   200    Y4  
C  10-01-2019 07:00:00  10-01-2019 04:00:00   100    Y3  

【问题讨论】:

    标签: r datetime data.table grouping padding


    【解决方案1】:

    不清楚时间是否为 24 小时制。您可以先创建一个半小时计时序列,然后加入原始数据集,然后使用zoo::na.locf 将最后一次观察向前推进:

    数据:

    library(data.table)
    DT <- fread("ID,t2,t1,varX,varY
    A,10-01-2019 06:00:00 PM,10-01-2019 12:00:00 PM,100,Y1 
    A,10-01-2019 06:00:00 PM,10-01-2019 12:30:00 PM,60,Y2 
    B,10-01-2019 06:00:00 PM,10-01-2019 01:00:00 PM,100,Y2 
    A,10-01-2019 06:30:00 PM,10-01-2019 01:30:00 PM,100,Y3 
    B,10-01-2019 06:30:00 PM,10-01-2019 02:00:00 PM,200,Y4 
    C,10-01-2019 07:00:00 PM,10-01-2019 04:00:00 PM,100,Y3") 
    cols <- c("t2", "t1")
    DT[, (cols) := lapply(.SD, as.POSIXct, format="%d-%m-%Y %I:%M:%S %p"), .SDcols=cols]
    

    代码:

    library(zoo)
    DT[DT[,.(t1=rev(seq(t2-30*60, length.out=48L, by="-30 mins"))), by=.(ID, t2)],
        .(ID=i.ID, t2=i.t2, t1=i.t1, varX=varX, varY=varY),
        on=.(ID, t2, t1)][,
            c("varX", "varY") := lapply(.SD, na.locf, na.rm=FALSE),
            , by=.(ID, t2), .SDcols=c("varX", "varY")][]
    

    【讨论】:

    • 我的数据的分组变量实际上是 ID 和 t2 一起。当我尝试使用包含不同 t2 值的略有不同数据的代码并将数据表更新为“by = .(ID, t2)”时,它返回了预期的行数,即 t1 的正确值,但是t2 的值不正确:它们都与 t2 的第一个值相同。
    • 使用数据:DT
    • 我将代码调整为:DT[ DT[,.(t1=rev(seq(t2[1L]-30*60, length.out=48L, by="-30 mins" ))), by=.(ID,t2)], .(ID=i.ID, t2=i.t2, t1=i.t1, varX=na.locf(varX, na.rm=FALSE), varY =na.locf(varY, na.rm=FALSE)), on=.(ID, t2, t1)] 但是 varX 和 varY 的值被带到下一组,而不是从 NA 值开始的下一组直到该组出现第一行完整的数据。
    • @Michael96 我用新的示例数据集更新了代码。您可能希望在 OP 中发布此示例数据集,因为它更清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多