请给我一个解决以下问题的提示:
DT[ , .N, by=date]
,日期属于日期类和格式%F
,
将给出每天的行数。
DT[ , .N, by=format(DateTime, "%F")]
,日期属于 POSIXct 类,格式为 %F %T
,
也将从 00:00:00 到 23:59:59 计数。
但是,我想要从 07:30:00 到第二天 07:29:59 的计数。
我使用术语 R、data.table、日期、日期更改或 24 小时间隔进行搜索,但我可能不知道此问题的正确术语。
我找到了一个解决方案,建议从 DateTime-Variable 中减去 7:30,将(真实)7:30 转换为(假)00:00:00。
这是要走的路吗?
我尝试过的是:
>library(dplyr)
>library(data.table)
>DT<-tibble(DateTime=c("2023-01-01 00:41:00", "2023-01-01 01:54:00", "2023-01-01 02:10:00", "2023-01-02 05:01:00", "2023-01-02 08:38:00", "2023-01-02 09:25:00", "2023-01-02 09:29:00", "2023-01-02 09:30:00", "2023-01-02 09:56:00"),
Date=c("01.01.2023", "01.01.2023", "01.01.2023", "02.01.2023", "02.01.2023", "02.01.2023", "02.01.2023", "02.01.2023", "02.01.2023"),
Time=c("00:41", "01:54", "02:10", "05:01", "08:38", "09:25", "09:29", "09:30", "09:56"))
>setDT(DT)
>DT[, ':='(DateTime=as.POSIXct(DateTime, "%F %T"),
Date=as.Date(Date, "%d.%m.%Y")
)]
>DT[, .N, by=Date]
Date N
<Date> <int>
1: 2023-01-01 3
2: 2023-01-02 6
>DT[, .N, by=Date-7.5*60*6]
Date N
<Date> <int>
1: 2015-08-11 3
2: 2015-08-12 6
>DT[, .N, by=DateTime]
DateTime N
<POSc> <int>
1: 2023-01-01 00:41:00 1
2: 2023-01-01 01:54:00 1
3: 2023-01-01 02:10:00 1
4: 2023-01-02 05:01:00 1
5: 2023-01-02 08:38:00 1
6: 2023-01-02 09:25:00 1
7: 2023-01-02 09:29:00 1
8: 2023-01-02 09:30:00 1
9: 2023-01-02 09:56:00 1
还有
DT[, .N, by=DateTime-7.5*60*60]
给出与上面相同的结果,只是时间减去 7.5 小时,当然。
如果有夏令时切换,您将遇到错误。 (即使这种不健康的传统有望有一天消失,过去的记录仍然会受到影响。) 正确的方法是对定义的时间间隔进行
seq
影响,á la seq.POSIXt(Sys.time(), by='-1 day', len=2)[2]
,这将给出昨天的同一时间。
但是,您在这里想要的是每个可用日期的
cut
日期时间为 0730:首先确定日期的 range
。接下来添加 c(-1, 1)
天以获得下限和上限,从而获得突破。最后cut
在休息时数数。
> library(data.table)
> (date_range <- as.POSIXct(paste(range(as.Date(DT$DateTime)) + c(-1, 1), '07:30:00')))
[1] "2022-12-31 07:30:00 CET"
[2] "2023-01-03 07:30:00 CET"
> (breaks <- do.call('seq.POSIXt', c(as.list(date_range), by='day')))
[1] "2022-12-31 07:30:00 CET"
[2] "2023-01-01 07:30:00 CET"
[3] "2023-01-02 07:30:00 CET"
[4] "2023-01-03 07:30:00 CET"
> DT[, .N, by=cut(DateTime, breaks)]
cut N
<fctr> <int>
1: 2022-12-31 07:30:00 3
2: 2023-01-01 07:30:00 1
3: 2023-01-02 07:30:00 5
数据:
> dput(DT)
structure(list(DateTime = structure(c(1672533660, 1672538040,
1672539000, 1672635660, 1672648680, 1672651500, 1672651740, 1672651800,
1672653360), class = c("POSIXct", "POSIXt"), tzone = "%F %T"),
Date = structure(c(19358, 19358, 19358, 19359, 19359, 19359,
19359, 19359, 19359), class = "Date"), Time = c("00:41",
"01:54", "02:10", "05:01", "08:38", "09:25", "09:29", "09:30",
"09:56")), row.names = c(NA, -9L), class = c("data.table",
"data.frame"))