R语言readr包读取不同格式时间列的问题求助
解决CSV时间列混合格式读取问题
我太懂你遇到的这个坑了——read_csv(来自readr包)的自动类型推断在碰到混合格式的时间列时,确实会搞出这种让人头疼的问题。咱们一步步来搞定它:
第一步:确保读取到原始的字符格式
首先,得让read_csv完全保留时间列的原始字符串,别让它瞎自动转换。你之前用col_character()的思路是对的,但可能漏了个参数防止意外截断,试试这个:
library(readr) # 强制按字符读取,关闭自动修剪空格避免误处理 df <- read_csv("data.csv", col_types = cols(time = col_character()), trim_ws = FALSE)
如果还是出现长格式被转成短格式的情况,换用base R的read.csv试试——它默认会把字符串原封不动读进来:
df <- read.csv("data.csv", stringsAsFactors = FALSE)
第二步:统一时间格式
拿到原始字符后,咱们手动把两种格式统一成你需要的样子:
选项1:统一为mm:ss格式
直接去掉长格式末尾的:00就行:
library(dplyr) library(stringr) df <- df %>% mutate(time = str_remove(time, ":00$"))
选项2:转换为秒数(方便后续计算)
如果需要做时间相关的统计,转成秒数更实用:
df <- df %>% mutate( time_seconds = sapply(strsplit(time, ":"), function(x) { x <- as.integer(x) # 不管是2段还是3段,计算总秒数(3段的话最后一位是0,不影响结果) sum(x * c(60, 1, 0)[1:length(x)]) }) )
选项3:转为标准时间类型(支持超长分钟数)
如果需要保留时间格式的可读性,用hms包的类型,它能处理像76:58这种超过60分钟的情况:
library(hms) df <- df %>% mutate( # 先统一成mm:ss,再补上前缀00:转成hms类型 time_hms = parse_hms(paste0("00:", str_remove(time, ":00$"))) )
为什么之前会出问题?
默认情况下read_csv会尝试推断列类型:如果它看到部分值是mm:ss:00,会把列推断为time类型(对应hms格式),但mm:ss格式不符合这个类型的解析规则,所以被标记为NA。如果你之前误把col_character()写成了col_time(),那长格式的:00会被自动隐藏(因为hms类型默认不显示前导的0小时和末尾的0秒),看起来就像被转成了短格式——这应该是你碰到的情况~
内容的提问来源于stack exchange,提问作者jakes
相关产品推荐
相关产品推荐

