据我了解,OP 希望在 5 年内创建一系列每小时时间戳,这些时间戳应显示在两列中,分别为日期(Date 类)和一天中的小时(整数)。
OP 的方法是创建一天中的小时数和天数的叉积。
恕我直言,有一种更简单的方法,它使用seq() 方法来处理日期时间类:
library(data.table)
library(lubridate)
DT <- data.table(time = seq(ymd_h("2004-01-01 00"),
ymd_h("2008-01-01 00"), by = "1 hour"))
DT
time
1: 2004-01-01 00:00:00
2: 2004-01-01 01:00:00
3: 2004-01-01 02:00:00
4: 2004-01-01 03:00:00
5: 2004-01-01 04:00:00
---
43845: 2008-12-31 20:00:00
43846: 2008-12-31 21:00:00
43847: 2008-12-31 22:00:00
43848: 2008-12-31 23:00:00
43849: 2009-01-01 00:00:00
现在,我们可以创建 date 和 hour 列:
DT[, date := as.Date(time)][, hour := hour(time)][]
time date hour
1: 2004-01-01 00:00:00 2004-01-01 0
2: 2004-01-01 01:00:00 2004-01-01 1
3: 2004-01-01 02:00:00 2004-01-01 2
4: 2004-01-01 03:00:00 2004-01-01 3
5: 2004-01-01 04:00:00 2004-01-01 4
---
43845: 2008-12-31 20:00:00 2008-12-31 20
43846: 2008-12-31 21:00:00 2008-12-31 21
43847: 2008-12-31 22:00:00 2008-12-31 22
43848: 2008-12-31 23:00:00 2008-12-31 23
43849: 2009-01-01 00:00:00 2009-01-01 0
警告
OP 的方法再创建近 2000 行
str(df)
'data.frame': 45700 obs. of 3 variables:
$ hour : int 0 1 2 3 4 5 6 7 8 9 ...
$ day_of_seq: int 0 1 2 3 4 5 6 7 8 9 ...
$ year : chr "nope" "2004" "2004" "2004" ...
比我的方法:
str(DT)
Classes ‘data.table’ and 'data.frame': 43849 obs. of 3 variables:
$ time: POSIXct, format: "2004-01-01 00:00:00" "2004-01-01 01:00:00" "2004-01-01 02:00:00" ...
$ date: Date, format: "2004-01-01" "2004-01-01" "2004-01-01" ...
$ hour: int 0 1 2 3 4 5 6 7 8 9 ...
- attr(*, ".internal.selfref")=<externalptr>
这是由于 OP 以 0:24 对一天中的时间进行编号,这意味着每个午夜出现两次,分别是实际日期的 2400 小时和后续日期的 0000 小时。
这可能是 OP 的意图,但通常2004-01-01 24:00:00 被认为与2004-01-02 00:00:00 表示时间相同的实例。