以下工作正常,但是今天我发现列表中缺少一小时。如何解释以及如何避免类似情况?
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 小时(观测),但这是时间发生变化的那一天。
如果您出于某种原因以丢失日期时间行结束,此解决方案将填补最旧和最新时间范围之间的缺失。这使用了
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"))
您可以通过以下
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