Исправить пропущенные времена в серии datetime в R - PullRequest
1 голос
/ 19 сентября 2019

У меня есть почасовой временной ряд даты-времени, отформатированный как «% Y-% m-% d% H:% M:% S» и как класс «символ».Цель состоит в том, чтобы преобразовать символьные данные в дату и время, используя as.POSIXct.Однако в некоторых записях во временном ряду отсутствует часть времени («% H:% M:% S»), хотя количество записей на дату (24) является правильным.

Возможно ли заполнитьво временной части этих записей с последовательностью часов, начинающейся с 00:00:00 и заканчивающейся 23:00:00 для каждой даты?

Исходный набор данных:

Date_time 
...
1991-03-31 21:00:00
1991-03-31 22:00:00 
1991-03-31 23:00:00
1991-04-01
1991-04-01
1991-04-01
...

Что я хочу:

Date_time 
...
1991-03-31 21:00:00
1991-03-31 22:00:00 
1991-03-31 23:00:00
1991-04-01 00:00:00
1991-04-01 01:00:00
1991-04-01 02:00:00
...

Самое близкое, что я получил, этоОбходной путь пока еще в символьном формате, но результат начинается в 16:00:00.Plz отправить Halp.

hours=c("00:00:00", "01:00:00", "02:00:00", "03:00:00", "04:00:00", "05:00:00", "06:00:00", "07:00:00", "08:00:00", "09:00:00", "10:00:00", "11:00:00", "12:00:00","13:00:00", "14:00:00", "15:00:00", "16:00:00", "17:00:00", "18:00:00", "19:00:00", "20:00:00","21:00:00", "22:00:00", "23:00:00")

Dataset %>%
  mutate(Date_time_filled = ifelse(nchar(as.character(Date_time))<19, 
                                   paste(Date_time, hours), 
                                   paste(Date_time)))

Что я получил (неправильно):

Date_time 
...
1991-03-31 21:00:00
1991-03-31 22:00:00 
1991-03-31 23:00:00
1991-04-01 16:00:00
1991-04-01 17:00:00
1991-04-01 18:00:00
...

РЕДАКТИРОВАТЬ:

 X metadata.id metadata.name metadata.lat metadata.lon              Date_time data.v data.s data.f
1   1     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 01:00:00     NA     NA    1,1
2   2     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 02:00:00     NA     NA    1,1
3   3     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 03:00:00     NA     NA    1,1
4   4     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 04:00:00     NA     NA    1,1
5   5     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 05:00:00     NA     NA    1,1
6   6     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 06:00:00     NA     NA    1,1
7   7     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 07:00:00     NA     NA    1,1
8   8     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 08:00:00     NA     NA    1,1
9   9     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 09:00:00     NA     NA    1,1
10 10     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 10:00:00     NA     NA    1,1
11 11     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 11:00:00     NA     NA    1,1
12 12     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 12:00:00     NA     NA    1,1
13 13     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 13:00:00     NA     NA    1,1
14 14     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 14:00:00     NA     NA    1,1
15 15     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 15:00:00     NA     NA    1,1
16 16     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 16:00:00     NA     NA    1,1
17 17     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 17:00:00     NA     NA    1,1
18 18     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 18:00:00     NA     NA    1,1
19 19     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 19:00:00     NA     NA    1,1
20 20     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 20:00:00     NA     NA    1,1
21 21     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 21:00:00     NA     NA    1,1
22 22     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 22:00:00     NA     NA    1,1
23 23     9411340 Santa Barbara      34.4031    -119.6928 1990-10-22 23:00:00     NA     NA    1,1
24 24     9411340 Santa Barbara      34.4031    -119.6928 1990-10-23 00:00:00     NA     NA    1,1
25 25     9411340 Santa Barbara      34.4031    -119.6928 1990-10-23 01:00:00     NA     NA    1,1

Ответы [ 3 ]

1 голос
/ 19 сентября 2019

Не уверен, что это то, что вы ищете, или, по крайней мере, это может поставить вас на путь:

# This is the working horse:
seq(as.POSIXct("1991-03-31 00:00:00"), as.POSIXct("1991-04-02 23:00:00"), by = "1 hour")

 [1] "1991-03-31 00:00:00 -05" "1991-03-31 01:00:00 -05" "1991-03-31 02:00:00 -05" "1991-03-31 03:00:00 -05" "1991-03-31 04:00:00 -05"
 [6] "1991-03-31 05:00:00 -05" "1991-03-31 06:00:00 -05" "1991-03-31 07:00:00 -05" "1991-03-31 08:00:00 -05" "1991-03-31 09:00:00 -05"
[11] "1991-03-31 10:00:00 -05" "1991-03-31 11:00:00 -05" "1991-03-31 12:00:00 -05" "1991-03-31 13:00:00 -05" "1991-03-31 14:00:00 -05"
[16] "1991-03-31 15:00:00 -05" "1991-03-31 16:00:00 -05" "1991-03-31 17:00:00 -05" "1991-03-31 18:00:00 -05" "1991-03-31 19:00:00 -05"
[21] "1991-03-31 20:00:00 -05" "1991-03-31 21:00:00 -05" "1991-03-31 22:00:00 -05" "1991-03-31 23:00:00 -05" "1991-04-01 00:00:00 -05"
[26] "1991-04-01 01:00:00 -05" "1991-04-01 02:00:00 -05" "1991-04-01 03:00:00 -05" "1991-04-01 04:00:00 -05" "1991-04-01 05:00:00 -05"
[31] "1991-04-01 06:00:00 -05" "1991-04-01 07:00:00 -05" "1991-04-01 08:00:00 -05" "1991-04-01 09:00:00 -05" "1991-04-01 10:00:00 -05"
[36] "1991-04-01 11:00:00 -05" "1991-04-01 12:00:00 -05" "1991-04-01 13:00:00 -05" "1991-04-01 14:00:00 -05" "1991-04-01 15:00:00 -05"
[41] "1991-04-01 16:00:00 -05" "1991-04-01 17:00:00 -05" "1991-04-01 18:00:00 -05" "1991-04-01 19:00:00 -05" "1991-04-01 20:00:00 -05"
[46] "1991-04-01 21:00:00 -05" "1991-04-01 22:00:00 -05" "1991-04-01 23:00:00 -05" "1991-04-02 00:00:00 -05" "1991-04-02 01:00:00 -05"
[51] "1991-04-02 02:00:00 -05" "1991-04-02 03:00:00 -05" "1991-04-02 04:00:00 -05" "1991-04-02 05:00:00 -05" "1991-04-02 06:00:00 -05"
[56] "1991-04-02 07:00:00 -05" "1991-04-02 08:00:00 -05" "1991-04-02 09:00:00 -05" "1991-04-02 10:00:00 -05" "1991-04-02 11:00:00 -05"
[61] "1991-04-02 12:00:00 -05" "1991-04-02 13:00:00 -05" "1991-04-02 14:00:00 -05" "1991-04-02 15:00:00 -05" "1991-04-02 16:00:00 -05"
[66] "1991-04-02 17:00:00 -05" "1991-04-02 18:00:00 -05" "1991-04-02 19:00:00 -05" "1991-04-02 20:00:00 -05" "1991-04-02 21:00:00 -05"
[71] "1991-04-02 22:00:00 -05" "1991-04-02 23:00:00 -05"

Это можно использовать так:

Dataset$date_time_filled <- seq(as.POSIXct(Dataset$date_time[1]),
                                as.POSIXct(Dataset$date_time[nrow(Dataset)]), 
                                by = "1 hour")

Если в последнем чтении date_time отсутствует время, оно будет работать, но будет считать последнее, как если бы оно произошло в 00:00:00, поэтому может произойти ошибка из-за разной длины вектора.Это вам, скорее всего, придется настроить вручную.

0 голосов
/ 24 сентября 2019

Вместо того, чтобы добавлять пропущенные времена в набор данных полного временного ряда, мне пришлось вернуться к отдельным наборам данных, содержащим данные только за один месяц.Месяцы отсутствующих данных всегда были апрельскими, следовательно, 30 дней.Тогда сработало следующее:

#Fix April Datasets missing hour data
hours=c("00:00:00", "01:00:00", "02:00:00", "03:00:00", "04:00:00", "05:00:00", "06:00:00", "07:00:00", "08:00:00", "09:00:00", "10:00:00", "11:00:00", "12:00:00","13:00:00", "14:00:00", "15:00:00", "16:00:00", "17:00:00", "18:00:00", "19:00:00", "20:00:00","21:00:00", "22:00:00", "23:00:00")
pattern=glob2rx("******04**.csv")

#Monthly Dataset
MonthlyData_filenames=list.files(path="~/.../Hourly",
                        pattern=pattern, full.names = T)
for(i in 1:length(MonthlyData_filenames)){
  input = read.csv(MonthlyData_filenames[i], head=TRUE, sep=",")
  if(nchar(as.character(input$Date_time))>=19){
    next
  }
  output = input %>%
    mutate(hour = rep(hours, times=30)) %>%
    mutate(Date_time = paste(Date_time, hour, sep=" ")) %>%
    select(-hour)
  write.csv(output, MonthlyData_filenames[i], row.names=FALSE)
}
0 голосов
/ 19 сентября 2019

Поскольку у вас уже есть количество записей для каждой Даты, и отсутствует только часть времени, один из подходов заключается в использовании sprintf и репликации части времени для каждой Даты.

library(dplyr)

df %>%
  mutate(Date_time1 = as.POSIXct(Date_time), 
         Date_time1 = paste(Date_time1, sprintf("%02d:00:00", 0:23)))

Попытка выполнить это в течение часов от 0 до 5 на небольшом подмножестве.

library(dplyr)
df %>%
  mutate(Date_time1 = as.POSIXct(Date_time), 
         Date_time1 = paste(Date_time1, sprintf("%02d:00:00", 0:5)))


#             Date_time          Date_time1
#1  1991-03-31 00:00:00 1991-03-31 00:00:00
#2  1991-03-31 01:00:00 1991-03-31 01:00:00
#3  1991-03-31 02:00:00 1991-03-31 02:00:00
#4  1991-03-31 03:00:00 1991-03-31 03:00:00
#5  1991-03-31 04:00:00 1991-03-31 04:00:00
#6  1991-03-31 05:00:00 1991-03-31 05:00:00
#7           1991-04-01 1991-04-01 00:00:00
#8           1991-04-01 1991-04-01 01:00:00
#9           1991-04-01 1991-04-01 02:00:00
#10          1991-04-01 1991-04-01 03:00:00
#11          1991-04-01 1991-04-01 04:00:00
#12          1991-04-01 1991-04-01 05:00:00

Вы можете запустить as.POSIXct в столбце Date_time1, чтобы преобразовать его в POSIXct объект.

данные

df <- structure(list(Date_time = structure(c(1L, 2L, 3L, 4L, 5L, 6L, 
7L, 7L, 7L, 7L, 7L, 7L), .Label = c("1991-03-31 00:00:00", "1991-03-31 01:00:00", 
"1991-03-31 02:00:00", "1991-03-31 03:00:00", "1991-03-31 04:00:00", 
"1991-03-31 05:00:00", "1991-04-01"), class = "factor")), class = 
"data.frame", row.names = c(NA, -12L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...