R语言中为日期时间序列加6天后取整至午夜的方法求助
问题分析与解决方案
首先纠正你的误解:R语言的日期时间系统(POSIXct/POSIXlt)不支持24:00这个时间点,输入24:00:00会被自动解析为次日的00:00:00,这就是你代码中出现“相当于加了7天”的核心原因——比如2021-01-01 11:00加6天后是2021-01-07 11:00,取日期得到2021-01-07,拼接24:00:00后会被解析为2021-01-08 00:00:00,看起来就像加了7天。
正确实现代码(基于lubridate)
下面的代码可以得到你需要的时间点,同时支持自定义显示为24:00格式:
library(dplyr) library(lubridate) trial_A <- data.frame(study_ID=c(5, 6, 7, 8), randomisation=as.POSIXct(c("2021-01-01 11:00", "2021-01-02 10:00", "2021-01-03 10:00", "2021-01-04 10:00"))) final <- trial_A %>% # 先给时间加6天 mutate(randomisation_plus_6 = randomisation + days(6), # 获取加6天后日期的"24:00"对应的实际时间点(即次日00:00) true_randomisation = floor_date(randomisation_plus_6, "day") + days(1), # 格式化显示为你期望的"YYYY-MM-DD 24:00:00"格式 true_randomisation_display = strftime(true_randomisation, "%Y-%m-%d 24:00:00"))
基础R实现(无需lubridate)
如果不想用lubridate包,也可以用基础R函数完成:
trial_A <- data.frame(study_ID=c(5, 6, 7, 8), randomisation=as.POSIXct(c("2021-01-01 11:00", "2021-01-02 10:00", "2021-01-03 10:00", "2021-01-04 10:00"))) # 给时间加6天(86400是一天的秒数) trial_A$randomisation_plus_6 <- trial_A$randomisation + 6 * 86400 # 获取加6天后日期的"24:00"对应的时间点 trial_A$true_randomisation <- trunc(trial_A$randomisation_plus_6, "day") + 86400 # 格式化显示为目标格式 trial_A$true_randomisation_display <- format(trial_A$true_randomisation, "%Y-%m-%d 24:00:00")
结果说明
- 存储的
true_randomisation列是实际的时间点(比如2021-01-08 00:00:00),对应你期望的2021-01-07 24:00:00,两者在时间上是等价的。 true_randomisation_display列是格式化后的字符串,完全符合你给出的期望输出样式。
内容的提问来源于stack exchange,提问作者GJW
相关产品推荐
相关产品推荐

