我有一个带有两个日期/时间列的数据框:
BeginTime EndTime Value
-----------------------------------------------------
1 2019-01-03 13:45:00 2019-01-03 17:30:00 41
2 2019-01-03 13:30:00 2019-01-03 14:30:00 20
3 2019-01-03 16:45:00 2019-01-03 19:00:00 23
我需要转换成这个:
Time Value
--------------------------------
1 2019-01-03 13:45:00 41
2 2019-01-03 14:00:00 41
3 2019-01-03 14:15:00 41
4 2019-01-03 14:30:00 41
5 2019-01-03 14:45:00 41
6 2019-01-03 15:00:00 41
7 2019-01-03 15:15:00 41
8 2019-01-03 13:30:00 20
9 2019-01-03 13:45:00 20
10 2019-01-03 14:00:00 20
11 2019-01-03 14:15:00 20
12 2019-01-03 16:45:00 23
但不确定如何执行此操作。有什么建议么?
创建testdf的代码
testdf <- data.frame(c("2019-01-03 13:45:00", "2019-01-03 13:30:00", "2019-01-03 16:45:00"),
c("2019-01-03 15:30:00", "2019-01-03 14:30:00", "2019-01-03 17:00:00"),
c(41,20,23))
colnames(testdf) <-c("BeginTime", "EndTime", "Value")
testdf$BeginTime <- as.POSIXct(testdf$BeginTime)
testdf$EndTime <- as.POSIXct(testdf$EndTime)
((我知道最初可能有一种将列创建为POSIXct的方法,但这是可行的)
seq
,并为每个Beginning - End
创建一个完整的15分钟间隔的列表,然后根据其长度使用rep
来获取值,即]]l1 <- Map(function(x, y)seq(x, y, by = '15 mins'), testdf$BeginTime, testdf$EndTime)
data.frame(Time = do.call(c, l1), value = rep(testdf$Value, lengths(l1)))
给出,
Time value
1 2019-01-03 13:45:00 41
2 2019-01-03 14:00:00 41
3 2019-01-03 14:15:00 41
4 2019-01-03 14:30:00 41
5 2019-01-03 14:45:00 41
6 2019-01-03 15:00:00 41
7 2019-01-03 15:15:00 41
8 2019-01-03 15:30:00 41
9 2019-01-03 13:30:00 20
10 2019-01-03 13:45:00 20
11 2019-01-03 14:00:00 20
12 2019-01-03 14:15:00 20
13 2019-01-03 14:30:00 20
14 2019-01-03 16:45:00 23
15 2019-01-03 17:00:00 23