【问题标题】:Generate timestamp for each ID in R in ascending order为R中的每个ID按升序生成时间戳
【发布时间】:2019-08-09 11:14:00
【问题描述】:

我尝试在 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

在 2 周的时间段内,我使用以下代码为每个 ID 设置了 24 小时 但是我得到了这个输出,但是时间戳的顺序不是我想要的,加上它从以前的值中添加了流量值,我想根据每个 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 组生成时间戳吗?

我们将不胜感激。

【问题讨论】:

  • 这些日期是如何确定的?
  • 我需要生成 POSIXct 格式的时间戳序列。我只需要制作假数据并在上面测试我的模型
  • 我知道Time_New 的时间部分来自Time 列,但我不清楚3 次观察后日期如何变化?

标签: r time timestamp time-series


【解决方案1】:

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

【讨论】:

  • 非常感谢!!这有助于为每个传感器分配时间!你知道我怎样才能产生超过 24 小时的数据吗?喜欢 2 周?
  • @Reta :编辑发布。希望它有所帮助。
【解决方案2】:

也许你可以使用base 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")

【讨论】:

  • 谢谢!但如果我想生成更多日期怎么办?
  • @Reta 不幸的是,您的帖子对如何生成日期相当模糊;所以答案是“是的,当然你可以生成更多日期”,其细节取决于你的具体问题陈述(不存在)。
  • 我已经按照这里最后一条评论中的命令:stackoverflow.com/questions/33181287/… 但我把它改成了小时而不是天。
猜你喜欢
  • 2019-08-14
  • 1970-01-01
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 2014-01-27
  • 2019-12-29
  • 1970-01-01
相关资源
最近更新 更多