date/time 上的数据整理

Data tidying on date/time

我有一个非常大的数据集,日期和时间在一个列中,每 15 分钟间隔与数据相对应。不幸的是,记录数据的软件有一些问题,所以随机有 15 分钟的间隔(通常是 1 或 2,但有时是 3 和 4)。数据集报告如下:

   Date_and_time         Pressure
   2016-07-08 18:00:00    3.542
   2016-07-08 18:15:00    5:444
   2016-07-08 18:45:00    2:556
   2016-07-08 19:00:00    4:567

我正在寻找一种在缺少的时间范围之间输入一行的方法。我的目标是将多个站点的这些数据堆叠在一起,我和我需要确保出于图形目的排列。

如果你能完美保证所有时间都在刻钟对齐,那么你可以试试这个:

tibble(Date_and_time = do.call(seq, c(as.list(range(dat$Date_and_time)), by="15 mins"))) %>%
  full_join(dat, by = "Date_and_time")
# # A tibble: 5 x 2
#   Date_and_time       Pressure
#   <dttm>              <chr>   
# 1 2016-07-08 18:00:00 3.542   
# 2 2016-07-08 18:15:00 5:444   
# 3 2016-07-08 18:30:00 <NA>    
# 4 2016-07-08 18:45:00 2:556   
# 5 2016-07-08 19:00:00 4:567   

如果您认为您的时间有可能没有完美对齐(即使是几分之一秒也会引入不必要的行),那么我们可以将其转化为问题“强制间隔不超过 15 分钟”

dat %>%
  group_by(grp = cumsum(c(FALSE, as.numeric(diff(Date_and_time), units = "mins") > 15))) %>%
  summarize(Date_and_time = max(Date_and_time) + 15*60) %>%
  bind_rows(dat) %>%
  arrange(Date_and_time) %>%
  select(-grp)
# # A tibble: 6 x 2
#   Date_and_time       Pressure
#   <dttm>              <chr>   
# 1 2016-07-08 18:00:00 3.542   
# 2 2016-07-08 18:15:00 5:444   
# 3 2016-07-08 18:30:00 <NA>    
# 4 2016-07-08 18:45:00 2:556   
# 5 2016-07-08 19:00:00 4:567   
# 6 2016-07-08 19:15:00 <NA>    

请注意,最后添加的行是不必要的,可以通过简单的清理步骤将其删除。第二种方法的前提是它创建了一个组,其中组内的所有内容间隔 15 分钟(或更短),然后将 15 分钟添加到最后一行。这样可以确保没有超过 15 分钟的间隔,但是:

  1. 它总是会在底部生成一行可能不需要的行;和
  2. 它不能保证添加的行和它们下面的行之间的间隙。例如,如果您的第三行是 "2016-07-08 18:31:00",那么时间将依次为 "18:15:00""18:30:00",然后是 "18:31:00"(间隔 1 分钟)。

数据

dat <- structure(list(Date_and_time = structure(c(1468015200, 1468016100, 1468017900, 1468018800), class = c("POSIXct", "POSIXt"), tzone = ""), Pressure = c("3.542", "5:444", "2:556", "4:567")), row.names = c(NA, -4L), class = "data.frame")

您可以创建一个包含所有可能采样时间的序列,然后将您的数据加入其中。

library(tidyverse)
ALL_PERIODS <-data.frame(SAMPLE_TIME= seq.POSIXt(from = as.POSIXlt("2016-07-08 18:00:00"), to =as.POSIXlt("2016-07-08 20:00:00"), by = "15 min"))

SAMPLE_DATA <- data.frame(Date_and_time= as.POSIXlt( c("2016-07-08 18:00:00","2016-07-08 18:15:00","2016-07-08 18:45:00","2016-07-08 19:00:00") ), pressure=c(3.542, 5.444,2.556, 4.567))


ALL_PERIODS_DATA <- left_join(ALL_PERIODS,SAMPLE_DATA, by=c("SAMPLE_TIME"="Date_and_time"))