基于时分列生成年月日序列的R语言技术实现需求
解决方案
可以用dplyr和lubridate包实现自动识别跨天并生成完整日期时间列,步骤如下:
- 将时间字符串转换为可比较的时间对象
- 标记跨天的行(当前时间小于前一行时间时判定为新一天)
- 累计跨天标记得到天数偏移量
- 基于起始日期生成每行的完整日期,再合并时间得到datetime列
完整代码
library(dplyr) library(lubridate) library(hms) # 加载你的数据集 df <- structure(list(Zeit = c("11:35:00 AM", "12:43:00 PM", "12:48:00 PM", "12:53:00 PM", "12:58:00 PM", "1:03:00 PM", "1:08:00 PM", "1:13:00 PM", "1:18:00 PM", "1:23:00 PM", "1:28:00 PM", "1:33:00 PM", "1:38:00 PM", "1:43:00 PM", "1:48:00 PM", "1:53:00 PM", "1:58:00 PM", "2:03:00 PM", "2:30:00 PM", "2:45:00 PM", "3:00:00 PM", "3:15:00 PM", "3:30:00 PM", "3:45:00 PM", "4:00:00 PM", "4:15:00 PM", "4:30:00 PM", "4:45:00 PM", "5:00:00 PM", "5:15:00 PM", "5:30:00 PM", "5:45:00 PM", "6:00:00 PM", "6:15:00 PM", "6:30:00 PM", "6:45:00 PM", "7:00:00 PM", "7:15:00 PM", "7:30:00 PM", "7:45:00 PM", "8:00:00 PM", "8:15:00 PM", "8:30:00 PM", "8:45:00 PM", "9:00:00 PM", "9:15:00 PM", "9:30:00 PM", "9:45:00 PM", "10:00:00 PM", "10:15:00 PM", "10:45:00 PM", "11:15:00 PM", "11:45:00 PM", "12:15:00 AM", "12:45:00 AM", "1:15:00 AM", "1:45:00 AM", "2:15:00 AM", "2:45:00 AM", "3:15:00 AM", "3:45:00 AM", "4:15:00 AM"), SRB = c(0, 0, 0, 0, 0, 0, 0, 0.0546352106, 1.89348740676, 14.16501124644, 33.21026613524, 45.19095110716, 51.16722074468, 46.13852290212, 38.99889779356, 31.72792609956, 26.59602736844, 23.91280426588, 18.5369761618, 13.35816793588, 10.76876382292, 8.55463566836, 7.29746120772, 5.824503071, 4.16390695508, 3.49779212892, 3.36644554348, 2.5877479298, 2.24999956724, 2.27814526412, 2.10927108284, 1.94977880052, 1.84657791196, 1.64017613484, 1.48068385252, 1.49006575148, 1.3211915702, 1.35871916604, 1.58388474108, 1.40562866084, 1.39624676188, 1.16169928788, 1.0397346014, 0.98344320764, 0.78642332948, 0.7582776326, 0.67384054196, 0.51434825964, 0.46743876484, 0.39238357316, 0.0827809074800001, 0.0264895137199999, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, -62L), class = "data.frame") # 生成完整日期时间列 df <- df %>% # 转换时间字符串为hms对象,便于时间比较 mutate(time = as_hms(Zeit)) %>% # 标记跨天的行:当前时间小于前一行则为新一天 mutate(new_day = if_else(time < lag(time, default = first(time)), 1, 0)) %>% # 累计跨天次数,得到相对于起始日期的天数偏移 mutate(day_offset = cumsum(new_day)) %>% # 计算每行的日期:起始日期 + 天数偏移 mutate(date = ymd("2023-10-24") + days(day_offset)) %>% # 合并日期和时间,生成完整的datetime列 mutate(datetime = ymd_hms(paste(date, time))) %>% # 移除中间过程列(可选) select(-time, -new_day, -day_offset) # 查看结果 head(df, 10) tail(df, 10)
代码说明
as_hms(Zeit):将Zeit列的字符串时间转换为hms类型,支持时间大小比较new_day列:通过比较当前行与前一行的时间,识别跨天的起始行day_offset:累计跨天次数,得到每行相对于起始日期的天数增量ymd("2023-10-24") + days(day_offset):生成每行对应的日期ymd_hms(paste(date, time)):合并日期和时间,得到标准的POSIXct格式日期时间
这个方案可以自动处理任意长度的数据集,无论跨天次数多少都能准确生成完整的日期时间列。
内容的提问来源于stack exchange,提问作者Daniel AG
相关产品推荐
相关产品推荐

