【问题标题】:R turn irregular time interval into regular ones using previous numbersR使用以前的数字将不规则的时间间隔变成规则的时间间隔
【发布时间】:2014-11-08 02:29:44
【问题描述】:

我有这样一个不规则的时间间隔

df=data.frame(Date=c("2013-01-08","2013-01-11","2013-01-13","2013-01-21","2013-02-06"), runningtotal=c(800,910,1060,1210,660)

我通过zoo对象发现它可以以固定的时间间隔合并,并填写0作为缺失值。但是,我需要填写以前的值,除了在月份开始用 0 填充它。所以最终输出是这样的:

date       runningtotal
2013-01-01 0
2013-01-02 0
...
2013-01-08 800
2013-01-09 800
2013-01-10 800
2013-01-11 910
2013-01-12 910
2013-01-13 1060
...
2013-02-01 0

另外,为了预测目的而填写这样的值是否有意义?

谢谢。

【问题讨论】:

  • 使用na.locf? (我会使用 data.tables 进行滚动连接。)

标签: r datetime time-series zoo


【解决方案1】:

使用constant 方法尝试approxfun。我没有lubridate,只处理常规的Date 对象。例如:

  df<-data.frame(Date=c("2013-01-08","2013-01-11","2013-01-13","2013-01-21","2013-02-06"), runningtotal=c(800,910,1060,1210,660))
  df$Date<-as.Date(as.character(df$Date))
  #create some new dates
  newDates<-seq(df$Date[1],df$Date[5],length.out=10)  
  intfun<-approxfun(df$Date,df$runningtotal,method="constant",yleft=0,yright=0)
  data.frame(newDates,intfun(newDates))

【讨论】:

  • 我不明白这个问题的答案是什么?预期输出与最终结果不同。答案被接受了,所以我肯定会错过一些东西。
  • 是的,我同意答案错过了给一个月的头几天打 0 的要点。尽管如此,我认为approxfun 的使用可能会有所帮助。当然,如果 OP 想“不接受”我的答案(这甚至可能吗?)我对此没有任何问题。
【解决方案2】:

我会使用来自zoo 包的na.locf。但是你应该在应用之前准备好数据。

## generate a vector of dates  
mm <- min(DF$Date)
day(mm) <- 1
seq_dates <- seq.POSIXt(mm,max(DF$Date),by='days')
## add zeros valus for the beging of month
DF <- rbind(DF,data.frame(Date=seq_dates[day(seq_dates)==1],runningtotal=0))
library(zoo)
## merge with the sequence of dates , and apply na.locf for previous values.
na.locf(merge(seq_dates,DF,by=1,all.x=TRUE))

这个想法是应用na.locf,用之前的非缺失值改变缺失值。将您的数据与一系列日期(从第一个月到日期结束)合并将插入缺失值。

【讨论】:

  • 感谢您的回答。效果很好
  • 也可以这样做:library(zoo); z &lt;- read.zoo(df); g &lt;- seq(start(z), end(z), "day"); zz &lt;- na.locf(merge(zoo(, g), z))。此时coredata(zz)time(zz) 是数据和日期。
  • @G.Grothendieck 很好,但您仍然需要处理:1- 月初的 0。2- 从第一个月的第一个日期创建 g
  • 没注意到。将其更改为:z &lt;- read.zoo(df); g &lt;- seq(as.Date(as.yearmon(start(z))), end(z), "day"); na.fill(na.locf(merge(zoo(, g), z), na.rm = FALSE), 0)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2021-07-20
  • 1970-01-01
相关资源
最近更新 更多