在R中插入缺少时间的行(格式为HH:MM:SS)

时间:2018-01-10 23:50:26

标签: r time time-series missing-data

我对R很新,并且正在尝试确定是否可以使用R来帮助填写我正在使用的大量数据集中的缺失值。我将尝试尽我所能解释它。

我正在处理的数据集的时间数据格式为HH:MM:SS。这是不规则的,因为没有两个数据集具有相同的时间戳,并且时间戳条目正在记录2小时内的事件。它看起来像这样。

imageService.getImages()

我想要的是以一分钟的间隔添加缺失的行,以便它看起来像这样。

1. Date,         Time_hms, Event
2. 9/22/2015,    00:00:00, 5
3. 9/22/2015,    00:00:24, 1
4. 9/22/2015,    00:00:24, 4
5. 9/22/2015,    00:01:42, 7
6. 9/22/2015,    00:02:04, 3
8. 9/22/2015,    00:02:35, 2
9. 9/22/2015,    00:03:02, 4

如果可能的话,我希望用该范围内发生的事件填充行。

在尝试解决这个问题时,我发现并尝试了这种方法Insert rows for missing dates/times。我尝试使用POSIXct但由于日期格式不成功。我也考虑过padr和fill_by_function,但我不确定这是否是正确的方法。有没有一种方法可以严格使用HH:MM:SS格式?

同样,我只是在学习R而且不确定如何处理这个问题。任何帮助或建议将不胜感激!

编辑:希望我能正确地做到这一点。再次感谢你!

1. Date,         Time_hms, Event
2. 9/22/2015,    00:00:00, 5
3. 9/22/2015,    00:00:24, 1
4. 9/22/2015,    00:00:24, 4
5. 9/22/2015,    00:01:00, 4     # Summary row to be inserted
6. 9/22/2015,    00:01:42, 7
7. 9/22/2015,    00:02:00, 7     # Summary row to be inserted
8. 9/22/2015,    00:02:04, 3
9. 9/22/2015,    00:02:35, 2
10. 9/22/2015,   00:03:00, 2     # Summary row to be inserted
11. 9/22/2015,   00:03:02, 4

1 个答案:

答案 0 :(得分:0)

好的,您的dput数据在第一列中有标题。所以我们首先要解决这个问题:

names(elements) = elements[1, ]
elements = elements[-1, ]
elements$Event = as.numeric(elements$Event)

现在我们将日期和时间转换为POSIX日期时间(在单独的向量中),然后我们将获取全部数据并将其四舍五入到最接近的分钟。然后我们可以创建从第一个到最后一个每分钟的序列(并省略日期,因此它的格式相同):

time_range = round(range(strptime(paste(elements$Date, elements$Time_hms), format = "%m/%d/%Y %H:%M:%S")), units = "mins")
each_minute = seq(from = time_range[1], to = time_range[2], by = "min")
each_minute = format(each_minute, "%H:%M:%S")

最后,我们merge将这些结果返回到原始数据中,对行进行排序,并使用zoo::na.locf使用之前的观察值填充缺失值。

result = merge(elements, data.frame(Time_hms = each_minute), all = T)
result = result[order(result$Time_hms), ]
result$Date = zoo::na.locf(result$Date)
result$Event = zoo::na.locf(result$Event)
result
#    Time_hms      Date Event
# 1  00:00:00 9/22/2015     5
# 2  00:00:24 9/22/2015     1
# 3  00:00:24 9/22/2015     4
# 4  00:01:00 9/22/2015     4
# 5  00:01:42 9/22/2015     7
# 6  00:02:00 9/22/2015     7
# 7  00:02:04 9/22/2015     3
# 8  00:02:35 9/22/2015     2
# 9  00:03:00 9/22/2015     2
# 10 00:03:02 9/22/2015     4

一般情况下,特别是如果您的数据可能包含不同的日期,如果您只是使用POSIX日期时间对象向数据添加新列,则可能会更容易使用。 R中没有一个好的班级来处理没有约会的时间(至少不是基数R) - 但是你有约会!还有很多函数可以很好地处理日期,比如我在这个答案中使用的seqround