我有一张表给出了我收到数据的日期时间以及30分钟间隔内收到的数据量。我的问题是缺少半小时的块,我想将它们插入到列中,然后在计数列中插入一个0。
以下是表格的示例:
Date-Time Count
2017-07-13 17:30:00 111
2017-07-13 18:00:00 85
2017-07-13 20:00:00 127
2017-07-13 20:30:00 515
我希望它有18:30:00 0等等
如果有人有一个很棒的想法,不知道如何做到这一点。
以下是我试图做的事情:
starttime <- df[1,`Date-Time`]
for (i in df){
time <- starttime + 30
new_dt$datetime <- ifelse(df[i] = time, df$datetime, time)
new_dt$count <- ifelse(df[i] = time, df$count, 0)
}
答案 0 :(得分:2)
首先让我们创建一些虚拟数据。
library(tidyverse)
library(lubridate)
time_series <- tibble(
DateTime = c(
"2017-07-13 17:30:00",
"2017-07-13 18:00:00",
"2017-07-13 20:00:00",
"2017-07-13 20:30:00"
),
Count = c(111, 85, 127, 515)
) %>%
mutate(DateTime = ymd_hms(DateTime))
现在让我们计算出数据中最小和最大的日期时间。
from <- min(time_series$DateTime)
to <- max(time_series$DateTime)
最后,让我们以30分钟的间隔从from
到to
创建一系列日期。然后,我们将现有数据加入到该序列中,并将Count
的任何缺失值替换为零。
tibble(DateTime = seq(from = from, to = to, by = 1800)) %>%
left_join(time_series) %>%
mutate(Count = ifelse(is.na(Count), 0, Count))
答案 1 :(得分:2)
虽然这些有用,但我认为最好的办法是使用padr
包:
library(dplyr)
library(padr)
pad_df <- df %>%
pad(interval = '30 mins')
如果您更喜欢0
到NA
,那么只需:
pad_df[is.na(pad_df)] <- 0
padr
软件包还具有thicken
功能,以防您需要快速无缝地更改为较低的频率。
答案 2 :(得分:1)
首先,我已将您的专栏Date-Time
的名称更改为Date.Time
。
#dput(dat)
dat <-
structure(list(Date.Time = structure(c(1499963400, 1499965200,
1499972400, 1499974200), class = c("POSIXct", "POSIXt"), tzone = ""),
Count = c(111L, 85L, 127L, 515L)), .Names = c("Date.Time",
"Count"), row.names = c(NA, -4L), class = "data.frame")
现在,诀窍是使用seq.POSIXct
创建一个只有一列的df,然后merge
两个dfs。
tmp <- data.frame(
Date.Time = seq(min(dat$Date.Time), max(dat$Date.Time), by = "30 min"))
tmp
Date.Time
1 2017-07-13 17:30:00
2 2017-07-13 18:00:00
3 2017-07-13 18:30:00
4 2017-07-13 19:00:00
5 2017-07-13 19:30:00
6 2017-07-13 20:00:00
7 2017-07-13 20:30:00
merge(dat, tmp, all.y = TRUE)
Date.Time Count
1 2017-07-13 17:30:00 111
2 2017-07-13 18:00:00 85
3 2017-07-13 18:30:00 NA
4 2017-07-13 19:00:00 NA
5 2017-07-13 19:30:00 NA
6 2017-07-13 20:00:00 127
如果需要,您可以rm(tmp)
。