2017-07-25 72 views
3

我有一个表格,它提供了我接收数据的日期和在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

显示您的最佳尝试 - 添加一些代码。 – Zydnar

回答

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个分钟的间隔创建日期从fromto的序列。然后,我们将现有数据加入该序列,并用零替换Count的任何缺失值。所有的

tibble(DateTime = seq(from = from, to = to, by = 1800)) %>% 
    left_join(time_series) %>% 
    mutate(Count = ifelse(is.na(Count), 0, Count)) 
+1

不错,打我一拳。 +1 – Val

+0

谢谢@Val!非常感激。 –

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)如果你想。

+0

用这种方式结束了,因为我对此更熟悉。谢谢你对我的工作很好 –

2

虽然这些工作,我认为最好的办法是使用padr包:如果你喜欢0年代到NA的,后来干脆

library(dplyr) 
library(padr) 

pad_df <- df %>% 
    pad(interval = '30 mins') 

pad_df[is.na(pad_df)] <- 0 

padr套件还具有thicken功能,以防您需要快速无缝地更改为较低的频率。

padr vignette