生成 df,包含指定日期的小时数和丢失的小时数

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

以下工作正常,但是今天我发现列表中缺少一小时。如何解释以及如何避免类似情况?

df.ref <- data.frame(Data = seq(as.POSIXct("2020-11-25 18:00:00"), now(), by = "hour"))

日期缺失 2023-03-26 02:00:00

这是由于从冬季到夏季的时间变化。但是,更改日期是可以更改的。我通过计算观察值来检查一天中每小时数据的完整性。在时间改变的日子里,有 23 小时/观察,我的机制认为这些日子不完整。

编辑: 预期结果是一个值为 0 或 1 的新列。 0 当给定日期的时间(观察)少于 24 小时时。 1 当一天中有 24 小时(观测)或 23 小时(观测),但这是时间发生变化的那一天。

r datetime
2个回答
1
投票

如果您出于某种原因以丢失日期时间行结束,此解决方案将填补最旧和最新时间范围之间的缺失。这使用了

complete
函数

datez <- c('2023-03-25 23:00:00','2023-03-26 00:00:00','2023-03-26 01:00:00','2023-03-26 03:00:00'
        ,'2023-03-26 04:00:00','2023-03-26 05:00:00','2023-03-26 06:00:00')

df <- data.frame(datez)

df$datez <- as.POSIXct(df$datez,'%Y-%m-%d %H:%M',tz='CST6CDT')

df <- complete(df,datez = seq.POSIXt(as.POSIXlt(min(datez)),as.POSIXlt(max(datez)),by="hour"))

1
投票

您可以通过以下

dplyr
解决方案为给定数据集导出所需的标志。我们使用
DST
导出指标,无论它是
lubridate::dst()
变化的日期。

df.ref <- data.frame(Data = seq(as.POSIXct("2020-11-25 18:00:00"), now(), by = "hour"))

library(dplyr)
library(lubridate)

df.ref |>
  mutate(Date = as.Date(Data, tz = "")) |> 
  mutate(DSTChange = dst(as.character(Date)) != lead(dst(as.character(Date)))) |>
  mutate(IsDSTChangeDate = any(DSTChange),
         NumEntries = n(), .by = Date) |> 
  mutate(Flag = ifelse(NumEntries == 24 | IsDSTChangeDate == TRUE, 1, 0)) |> 
  select(-c(Date, DSTChange, IsDSTChangeDate, NumEntries))

例如使用问题中给出的

df.ref
head()
代表
Flag == 0
将按预期给出以下条目:

                 Data Flag
1 2020-11-25 18:00:00    0
2 2020-11-25 19:00:00    0
3 2020-11-25 20:00:00    0
4 2020-11-25 21:00:00    0
5 2020-11-25 22:00:00    0
6 2020-11-25 23:00:00    0
© www.soinside.com 2019 - 2024. All rights reserved.