You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:48:24