R中将dataframe多列字符转datetime提取时间并计算每行时间均值
问题原因
你现有代码调用as.Date()处理数据,该函数设计上仅保留日期维度信息,会自动丢弃时间部分,因此所有时间值都会被重置为00:00:00。
实现方案
基础R实现(无需安装额外包)
# 步骤1:将第2~30列字符转换为完整datetime类型 Data[, 2:30] <- lapply(Data[, 2:30], as.POSIXct, format = "%Y-%m-%d %H:%M:%S") # 步骤2:仅保留时间部分,格式为HH:MM:SS Data[, 2:30] <- lapply(Data[, 2:30], function(x) strftime(x, "%H:%M:%S")) # 步骤3:计算每行时间的均值 Data$Avg_time <- apply(Data[, 2:30], 1, function(row) { # 将每行时间转为当日0点以来的秒数,计算均值后转回时间格式 sec_vec <- as.numeric(as.POSIXct(row, format = "%H:%M:%S")) avg_sec <- mean(sec_vec - as.numeric(as.POSIXct(Sys.Date()))) strftime(as.POSIXct(avg_sec, origin = "1970-01-01", tz = "UTC"), "%H:%M:%S") })
更简洁的lubridate实现(推荐,处理时间逻辑更健壮)
先安装加载依赖包:
install.packages(c("lubridate", "hms")) library(lubridate) library(hms)
处理代码:
# 转换为datetime后直接提取时间部分 Data[, 2:30] <- lapply(Data[, 2:30], function(x) as_hms(ymd_hms(x))) # 计算行均值 Data$Avg_time <- apply(Data[, 2:30], 1, function(row) as_hms(mean(as.numeric(row))))
运行上述代码后即可得到符合要求的输出结果。
内容的提问来源于stack exchange,提问作者Novice1604
相关产品推荐
相关产品推荐

