按升序为R中的每个ID生成时间戳

问题描述 投票:-1回答:2

我试图在R中为我的数据生成时间戳,并且我有问题创建它们,其中每个ID将在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小时为每个ID 2周的时间段,但我得到了这个输出,但时间戳的顺序不是我想要的,加上它添加了以前值的流量值,我想生成基于每个ID的流量平均值的新时间戳的新值。

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个ID,它开始重复ID 1,2,对于ID 3,它将时间列表从1-3开始,并复制相同的流量值。

任何人都知道如何按升序为每个Id组生成时间戳?

非常感谢。

r time timestamp time-series id
2个回答
0
投票

您可以使用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

编辑:关于在多个时间段内添加日期的注释。

假设我们希望2018-01-01的前3个条目和2018-01-02的下3个条目,我们可以执行以下操作:

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"

0
投票

也许你可以使用基地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")
© www.soinside.com 2019 - 2024. All rights reserved.