Временные ряды не прерываются даже на полчаса для импортированного набора данных - PullRequest
0 голосов
/ 21 октября 2018

Я работал над некоторым анализом и для удобства группировал данные в получасовые средние группы, поскольку разрешение данных очень хорошее (каждые 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

Проблема заключается в том, что когда я добавляю класс получасового перерыва, перерывы делаются на полчаса, основываясь на первом измерении даты и времени.,Используемый код:

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 по-прежнему возникает.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Я предпочитаю 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
0 голосов
/ 21 октября 2018

Вы можете использовать floor_date из пакета lubridate для округления минут до ближайших 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

data:

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))
...