【问题标题】:Padding time series with missing time units填充缺少时间单位的时间序列
【发布时间】:2015-02-13 10:07:42
【问题描述】:

我有以下带有闰分钟的数据(示例)(例如,缺少 6:32 和 6:33)。对于这些情况,count 等于 0,但数据库只是没有报告它们并跳过了分钟。

count   time
47  15/12/2014 06:30
3   15/12/2014 06:31
431 15/12/2014 06:34
320 15/12/2014 06:35
42  15/12/2014 06:36
13  15/12/2014 06:37
383 15/12/2014 06:38
160 15/12/2014 06:39

我曾尝试关注其他帖子 (I,II,III),他们使用了xts package,但没有成功。我尝试了自己的方法,但也没有用:

sort.df <- df[order(df$time),]
time.min <- min(sort.df$time)
time.max <- max(sort.df$time)
all.dates <- seq(time.min, time.max, by="min") # I create a list of all the minutes. 
all.dates.frame <- data.frame(list(time=all.dates))
merged.data <- merge(all.dates.frame, sorted.data, all=T) 

我得到的只是与 NA 值重复的所有分钟。有人知道我在做什么错吗?非常感谢任何帮助/想法!

【问题讨论】:

  • 您是同时处理多个数据帧,还是只是一个数据帧需要调整分钟数?你的“时间”栏的格式是什么?
  • 这个位将在我读取 csv 文件的循环中,做一些代数并绘制它。所以我会处理很多数据帧,但不会同时处理。
  • 请编辑您的问题以提供dput(head(df)) 的输出。
  • @StephanKolassa ,请查看更改。感谢您的帮助

标签: r datetime time-series na


【解决方案1】:

这个怎么样 - 它适用于小样本数据:

您的输入数据:

df <- read.table(header=T, text='count   time
47  "15/12/2014 06:30"
3   "15/12/2014 06:31"
431 "15/12/2014 06:34"
320 "15/12/2014 06:35"
42  "15/12/2014 06:36"
13  "15/12/2014 06:37"
383 "15/12/2014 06:38"
160 "15/12/2014 06:39"')

格式化“时间”列:

df$time <- as.POSIXct(df$time, format = "%d/%m/%Y %H:%M")

创建一个包含所有分钟的新 data.frame:

newdf <- data.frame(time = seq(min(df$time), max(df$time), by = "mins"))

然后将其与原始数据合并:

merge(newdf, df, by = "time", all.x = TRUE)
#                  time count
#1  2014-12-15 06:30:00    47
#2  2014-12-15 06:31:00     3
#3  2014-12-15 06:32:00    NA
#4  2014-12-15 06:33:00    NA
#5  2014-12-15 06:34:00   431
#6  2014-12-15 06:35:00   320
#7  2014-12-15 06:36:00    42
#8  2014-12-15 06:37:00    13
#9  2014-12-15 06:38:00   383
#10 2014-12-15 06:39:00   160

【讨论】:

  • 效果很好。谢谢。只是一个问题,它是 all.x = TRUE 的函数吗?我认为这有点缺失
  • 是的,这可能是缺少的部分
  • 答案:all.x的含义[其中x是第一个数据框,y是合并的第二个数据框]逻辑;如果为 TRUE,那么额外的行将被添加到输出中,x 中的每一行在 y 中没有匹配的行。这些行将在那些通常用来自 y 的值填充的列中具有 NA。默认值为 FALSE,因此只有包含 x 和 y 数据的行才会包含在输出中
【解决方案2】:

如果您使用诸如 zoo 或 xts 之类的时间序列表示,您正在执行的大部分操作都是自动执行的。动物园小插曲中有这样的例子,但这里又来了。 g 是一个时间网格,基于它,我们将具有这些时间的零宽度系列与 z 合并以获得结果:

# test data
Lines <- "count,time
47,15/12/2014 06:30
3,15/12/2014 06:31
431,15/12/2014 06:34
320,15/12/2014 06:35
42,15/12/2014 06:36
13,15/12/2014 06:37
383,15/12/2014 06:38
160,15/12/2014 06:39"

library(zoo)
df <- read.csv(text = Lines)

# convert to zoo
fmt <- "%d/%m/%Y %H:%M"
z <- read.zoo(df, index = 2, tz = "", format = fmt)

# create grid and merge 0-width series based on it with z
g <- seq(start(z), end(z), by = "min") # grid of times
merge(z, zoo(, g))

给予:

2014-12-15 06:30:00 2014-12-15 06:31:00 2014-12-15 06:32:00 2014-12-15 06:33:00 
                 47                   3                  NA                  NA 
2014-12-15 06:34:00 2014-12-15 06:35:00 2014-12-15 06:36:00 2014-12-15 06:37:00 
                431                 320                  42                  13 
2014-12-15 06:38:00 2014-12-15 06:39:00 
                383                 160 

如果我们从输入文件而不是数据框 df 开始,那么我们可以将 read.csvread.zoo 语句组合成一个 read.zoo 语句:

z <- read.zoo(text = Lines, header = TRUE, sep = ",", index = 2, tz = "", format =fmt)

【讨论】:

    【解决方案3】:

    这现在可以在包padr 中方便地实现。如果你的数据框是由 docendo 准备的(日期时间保存为POSIXct),这就是你所需要的:

    library(padr)
    pad(df)
    

    请参阅vignette("padr") 了解其工作原理。

    【讨论】:

      猜你喜欢
      • 2022-12-21
      • 2017-05-02
      • 2016-04-05
      • 1970-01-01
      • 2017-05-06
      • 2011-04-03
      • 2019-05-16
      • 2015-08-08
      • 1970-01-01
      相关资源
      最近更新 更多