我试图在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组生成时间戳?
非常感谢。
您可以使用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"
也许你可以使用基地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")