Создать метку времени для каждого идентификатора в R в порядке возрастания - PullRequest
0 голосов
/ 19 марта 2019

Я попытался сгенерировать временную метку в R для своих данных, и у меня возникла проблема с их созданием, чтобы каждый идентификатор получал группу временных меток в течение 14 дней, и мне нужно создать их в порядке возрастания.

Мои данные выглядят следующим образом:

ID      Lat          Long    Traffic   Time
1      -80.424      40.4242    54       1am
2      -80.114      40.4131    30       1am
3      -80.784      40.1142    12       1am
1      -80.424      40.4242    22       2am
2      -80.114      40.4131    31       2am
3      -80.784      40.1142    53       2am

И я хочу, чтобы мои данные были такими:

ID      Lat          Long    Traffic        Time_New
1      -80.424      40.4242    54       2018/01/01 01:00
2      -80.114      40.4131    30       2018/01/01 01:00
3      -80.784      40.1142    12       2018/01/01 01:00
1      -80.424      40.4242    22       2018/01/02 02:00
2      -80.114      40.4131    31       2018/01/02 02:00
3      -80.784      40.1142    53       2018/01/02 02:00

Я использовал приведенный ниже код до 24 часов для каждого идентификатора дляпериод времени 2 недели, но я получил этот вывод, но порядок временной метки не тот, который я хочу, плюс он добавил значение трафика из предыдущих значений, и я хочу сгенерировать новые значения новой временной метки на основе среднего значенияпоток трафика каждого идентификатора.

library(data.table)
Data<- setDT(Data)[, .SD[rep(1:.N, ID)]][,Time_New:= seq(as.POSIXct("2018-01-01 01:00"), as.POSIXct("2018-01-14 00:00"),by = "hour"),by = .(Lat, Long)][]




ID      Lat          Long    Traffic        Time_New           Time
1      -80.424      40.4242    54       2018/01/01 01:00        1am
2      -80.114      40.4131    30       2018/01/01 01:00        1am
3      -80.784      40.1142    12       2018/01/01 01:00        1am
1      -80.424      40.4242    54       2018/01/02 02:00        2am
2      -80.114      40.4131    54       2018/01/02 03:00        2am 
1      -80.424      40.4242    54       2018/01/01 02:00        2am
2      -80.114      40.4131    54       2018/01/01 03:00        2qm
3      -80.784      40.1142    30       2018/01/01 01:00        3am
3      -80.784      40.1142    30       2018/01/01 02:00        3am
3      -80.784      40.1142    30       2018/01/01 03:00        3am

Как видите, он перечислил первые 3 идентификатора в порядке, который я хочу, затем он начинает повторять идентификаторы 1, 2, а для идентификатора 3 он помещает список времени из 1-3, и скопируйте одно и то же значение трафика.

Кто-нибудь знает, как сгенерировать метку времени для каждой группы идентификаторов в порядке возрастания?

это будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 19 марта 2019

Возможно, вы можете использовать базовые R as.POSIXct

refdate <- "2018-01-01"
dt[
    , Time_new := as.POSIXct(paste(refdate, Time), format = "%Y-%m-%d %I%p")][
    , Time := NULL][]
#   ID     Lat    Long Traffic            Time_new
#1:  1 -80.424 40.4242      54 2018-01-01 01:00:00
#2:  2 -80.114 40.4131      30 2018-01-01 01:00:00
#3:  3 -80.784 40.1142      12 2018-01-01 01:00:00
#4:  1 -80.424 40.4242      22 2018-01-01 02:00:00
#5:  2 -80.114 40.4131      31 2018-01-01 02:00:00
#6:  3 -80.784 40.1142      53 2018-01-01 02:00:00

Здесь я предполагаю, что дата всегда одна и та же (ваш пример показывает изменение даты, которое не ясно и не объяснено).


Пример данных

library(data.table)
dt <- fread("ID      Lat          Long    Traffic   Time
1      -80.424      40.4242    54       1am
2      -80.114      40.4131    30       1am
3      -80.784      40.1142    12       1am
1      -80.424      40.4242    22       2am
2      -80.114      40.4131    31       2am
3      -80.784      40.1142    53       2am")
0 голосов
/ 19 марта 2019

Этого можно добиться с помощью библиотеки lubridate:

library(lubridate)

Time = c("1am", "1am", "1am", "2am", "2am", "2am")

new.Time = as.POSIXct(Time, format = "%H%p", tz = "")
date(new.Time) = "2018-01-01"
> new.Time
[1] "2018-01-01 01:00:00 EST" "2018-01-01 01:00:00 EST" "2018-01-01 01:00:00 EST" "2018-01-01 02:00:00 EST"
[5] "2018-01-01 02:00:00 EST" "2018-01-01 02:00:00 EST"

наконец, вы можете просто добавить этот столбец в ваш фрейм данных

df$Time_New = new.Time

Редактировать : Комментарий сделан по поводу добавления дат за несколько периодов времени.

Предположим, что мы хотим получить первые 3 записи 2018-01-01 и следующие 3 записи 2018-01-02, мы можем сделать следующее:

date(new.Time) = c(rep("2018-01-01",3),
                   rep("2018-01-02",3))
> new.Time
[1] "2018-01-01 01:00:00 EST" "2018-01-01 01:00:00 EST" "2018-01-01 01:00:00 EST"
[4] "2018-01-02 02:00:00 EST" "2018-01-02 02:00:00 EST" "2018-01-02 02:00:00 EST"
...