【问题标题】:How can I complete missing values in time series如何完成时间序列中的缺失值
【发布时间】:2019-09-22 17:30:44
【问题描述】:

我有哪些列是数据集 datetime_idnum_travel。比如

date       time_id  num_travel
02/25/2013       6        23
02/25/2013       7        20
02/25/2013       8        55
02/25/2013       9        89
02/25/2013       10       150
02/25/2013       11       100

...
02/27/2013       1        20
...

time_id 表示该日期的哪个小时。
num_travel 表示旅行次数。

time_id 范围是 1~24 为 1 天,但总是随机丢失 1~6 为每天。如何添加带有num_travel(将此值初始化为0)的行,例如

 03/24/2013     2      0   # (the data not exist in dataset, but need to be added)

因为数据集从 1 到 6 随机丢失了 time_id,所以很难构建这些行。我需要 R 中的一些帮助来进行数据清理。

【问题讨论】:

  • 我认为complete 会从tidyr 帮助你。类似complete(df, date, time_id, fill = list(num_travel = 0))
  • 函数应该是这样的吗? complete(data, data$date, data$time_id, fill = list(num_travel = 0)) 不是这样的
  • 试试new_data <- complete(data, date, time_id, fill = list(num_travel = 0))new_data是你的输出数据框。

标签: r dataframe time-series missing-data


【解决方案1】:

我不确定是否正确理解了您的问题,所以我给您两个答案。我只使用基本的 R。

library(lubridate)

df <- data.frame(date = mdy(c(rep("02/25/2013", 6), "02/27/2013")),
                 time_id = c(6:11, 1),
                 num_travel = c(23, 20, 55, 89, 150, 100, 20))

want_to_add <- data.frame(date = mdy("03/27/2013"),
                          time_id = 2,
                          num_travel = 0)

如果你只需要添加几行,第一个答案:

rbind(df, want_to_add)

如果你有很多缺失的数据并且你想要一个 0 的伪完整数据库,你可以为变量 num_travel 构建一个只有 0 的完整数据库,然后添加你已经知道的关于 num_travel 的内容:

# vector of Date
date_start <- as.POSIXct("2013-02-25 01:00:00", tz = "GMT")
date_end <- as.POSIXct("2013-03-27 01:00:00", tz = "GMT")

Date <- seq(date_start, date_end, by="hour")

# complet data set with 0 for num_travel
df_res <- data.frame(date = as.Date(Date), time_id = hour(Date) + 1, num_travel = 0)

# add what you know 
df_res[paste(df_res$date, df_res$time_id) %in% paste(df$date, df$time_id), ]$num_travel = df$num_travel

【讨论】:

  • 从2013/02/25到2013/03/24的总日期672行,数据553行,所以c(data$date, data$time_id)都要包含在日期的 675 行中。但是有一个错误显示There are 553 rows in the replacement data, but the data has 548 rows. 但是df_res 的数量是672 行。它是如何计算出数据有548行的。
  • 显然,由于上面的代码,所有分解的日期都应该在构建的日期中。您确定您的所有日期都与对象的日期格式相同:df_res$date。使用 %in% 比较字符,因此它需要完全相同的日期格式。您可以使用润滑脂的ydm 功能。我希望它会帮助你。如果没有,请告诉我
  • 非常感谢,您的方法效果很好。我的代码运行不好的原因是as.POSIXct函数一定有问题。它在 2013/02/24 更改了 5 行数据,应该是 2015/02/25。我用as.Date代替as.POSIXct,代码运行良好。
猜你喜欢
  • 2018-07-21
  • 2016-04-11
  • 1970-01-01
  • 2016-03-28
  • 2021-01-22
  • 2018-08-24
  • 2018-05-14
  • 1970-01-01
  • 2021-06-21
相关资源
最近更新 更多