新手求助:用readxl导入Excel日期时间列并合并计算时长
解决readxl导入日期+时间并合并的问题
嘿,别担心,新手第一次发帖遇到这种问题太正常啦!折腾了好几个小时确实头大,我来帮你把这个日期时间合并的事儿捋清楚~
第一步:正确导入日期和时间列
有时候R自动推断列类型会出问题,比如把日期当成字符,或者时间识别不准,所以我们可以手动指定导入类型,避免后续麻烦:
方法1:用col_types整体指定
如果知道日期列和时间列的位置,比如第1列是日期,第2到第5列是时间,可以这样写:
library(readxl) # 假设你的文件叫data.xlsx,第1列是日期,2-5列是时间 df <- read_excel("data.xlsx", col_types = c("date", rep("time", 4)))
方法2:用cols精准指定列(更推荐)
如果知道列名,直接指定对应列的类型,格式也可以明确写出来,避免识别错误:
df <- read_excel("data.xlsx", cols = list( 日期列名 = col_date(format = "dd/mm/yyyy"), 时间列1 = col_time(format = "hh:mm"), 时间列2 = col_time(format = "hh:mm") ))
注意:把上面的日期列名、时间列1换成你实际的列名就行
第二步:合并日期和时间列
readxl导入的日期是Date类型(只包含日期,默认当天0点),时间是hms类型(属于时长类对象),我们可以把它们合并成POSIXct类型的完整日期时间:
先加载需要的包
library(hms) # 处理时间类型的必备包 library(dplyr) # 用管道操作更顺手,不用也可以
合并操作(两种方式选一种)
方式1:用dplyr的管道语法
df <- df %>% mutate( # 合并日期和第一个时间列 datetime1 = as.POSIXct(日期列名) + as.duration(时间列1), # 合并日期和第二个时间列 datetime2 = as.POSIXct(日期列名) + as.duration(时间列2) )
方式2:基础R语法
df$datetime1 <- as.POSIXct(df$日期列名) + as.duration(df$时间列1) df$datetime2 <- as.POSIXct(df$日期列名) + as.duration(df$时间列2)
特殊情况处理:如果导入后日期/时间是字符类型
如果自动推断没做好,日期或时间变成了字符,先转成正确类型再合并:
# 把字符日期转成Date类型 df$日期列名 <- as.Date(df$日期列名, format = "dd/mm/yyyy") # 把字符时间转成hms类型 df$时间列1 <- hms::as_hms(df$时间列1)
验证和后续使用
合并后的datetime1、datetime2是带完整时间的日期对象,你可以直接做时长计算,比如:
# 计算两个时间的间隔 df$时长 <- df$datetime2 - df$datetime1
得到的时长是difftime类型,可以直接查看小时、分钟等单位~
内容的提问来源于stack exchange,提问作者pedal999
相关产品推荐
相关产品推荐

