R、data.table 和手动定义的 24 小时间隔开始

问题描述 投票:0回答:1

请给我一个解决以下问题的提示:

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 小时,当然。

r date datetime data.table intervals
1个回答
0
投票

如果有夏令时切换,您将遇到错误。 (即使这种不健康的传统有望有一天消失,过去的记录仍然会受到影响。) 正确的方法是对定义的时间间隔进行

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"))
© www.soinside.com 2019 - 2024. All rights reserved.