对于导入的数据集,时间序列甚至不会在半小时内中断

Time series breaks not even on the half hour for an imported dataset

我一直在进行一些分析,为了方便起见,我一直将数据分组为半小时平均组,因为数据分辨率非常好(每 2 分钟一次,持续几个月)。

数据导入如下:

unq_id    dat_tim      sens_hgt  leaf_temp_c  
   1    5/18/17 10:22      2      29.82043 
   2    5/18/17 10:24      2      32.27954 
   3    5/18/17 10:26      2      32.48996 
   4    5/18/17 10:28      2      31.81604 
   5    5/18/17 10:30      2      31.56943

问题是,当我添加半小时休息时间 class 时,休息时间是基于第一次日期时间测量的半小时增量。使用的代码:

leaf_temp_df <- read.csv("leaf_master.csv",header = TRUE, sep = ",")
leaf_temp_df$halfhour <- cut(as.POSIXct(paste(leaf_temp_df$dat_tim),
                                        format = "%m/%d/%y %H:%M"), breaks = "30 min")  

输出:

unq_id    dat_tim     sens_hgt  leaf_temp_c        halfhour
   1   5/18/17 10:22      2      29.82043     2017-05-18 10:22:00
   2   5/18/17 10:24      2      32.27954     2017-05-18 10:22:00
   3   5/18/17 10:26      2      32.48996     2017-05-18 10:22:00
   4   5/18/17 10:28      2      31.81604     2017-05-18 10:22:00
   5   5/18/17 10:30      2      31.56943     2017-05-18 10:22:00

输出遵循该模式,直到到达 10:52:00

的下一个中断点

我希望半小时矢量在半小时(例如 10:30:00 和 11:00:00)上是偶数,以实现不同数据类型之间的兼容性。为了解决这个问题,我尝试跳过前四行数据,使 unq_id = 5 成为从 10:30 开始读取的第一行。

leaf_temp_df <- read.csv("leaf_master.csv", header = TRUE, sep = ",")[-c(1:4),]

这仍然存在从 10:22 开始的半小时休息的相同问题。我什至尝试编辑主数据文件并从文件中删除第 1-4 行,以使中断能够在偶数半小时 (10:30) 读取第一个日期时间,但 10:22 问题仍然存在出现了。

您可以使用 lubridate 包中的 floor_date 将分钟四舍五入到最接近的 30 分钟。

library(dplyr)
library(lubridate)

df1 %>% 
  mutate(dat_tim = mdy_hm(df1$dat_tim), # format dat_tim, remove if dat_tim is already in date time format
         halfhour = floor_date(dat_tim, unit = "30 mins"))

  unq_id             dat_tim sens_hgt leaf_temp_c            halfhour
1      1 2017-05-18 10:22:00        2    29.82043 2017-05-18 10:00:00
2      2 2017-05-18 10:24:00        2    32.27954 2017-05-18 10:00:00
3      3 2017-05-18 10:26:00        2    32.48996 2017-05-18 10:00:00
4      4 2017-05-18 10:28:00        2    31.81604 2017-05-18 10:00:00
5      5 2017-05-18 10:30:00        2    31.56943 2017-05-18 10:30:00

数据:

df1 <- structure(list(unq_id = 1:5, dat_tim = c("5/18/17 10:22", "5/18/17 10:24", 
"5/18/17 10:26", "5/18/17 10:28", "5/18/17 10:30"), sens_hgt = c(2L, 
2L, 2L, 2L, 2L), leaf_temp_c = c(29.82043, 32.27954, 32.48996, 
31.81604, 31.56943)), class = "data.frame", row.names = c(NA, 
-5L))

我更喜欢lubridate::floor_date

library(lubridate)
df$dat_tim <- mdy_hm(df$dat_tim)
df$halfhour <- floor_date(df$dat_tim, "30 minutes")


   unq_id             dat_tim sens_hgt leaf_temp_c            halfhour
1 5/18/17 2017-05-18 10:22:00        2    29.82043 2017-05-18 10:00:00
2 5/18/17 2017-05-18 10:24:00        2    32.27954 2017-05-18 10:00:00
3 5/18/17 2017-05-18 10:26:00        2    32.48996 2017-05-18 10:00:00
4 5/18/17 2017-05-18 10:28:00        2    31.81604 2017-05-18 10:00:00
5 5/18/17 2017-05-18 10:30:00        2    31.56943 2017-05-18 10:30:00