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

在R中如何将带日期与数值的txt文件正确解析为数据框

问题原因

你的判断完全正确:read_table默认按任意连续空白符分割列,会将每行前半部分的日期时间拆分为4个独立列(X1存年份、X2存月份缩写、X3存日期、X4存时分秒),你给X1单独指定包含4个部分的日期格式,自然会出现解析失败,报错信息里的actual字段仅显示2021也印证了这一点。

可用解法

解法1:先读取全列再合并转换

逻辑直观,适合固定分隔格式的场景:

library(readr)
library(dplyr)
library(lubridate)

# 先将所有列读取为字符型,避免提前转换报错
df_raw <- read_table("myFile.txt", col_names = FALSE, col_types = cols(.default = col_character()))

# 合并日期时间列、提取数值列,最终保留需要的字段
df <- df_raw %>%
  mutate(
    # 合并前4列后转换为日期时间类型,指定英文locale识别月份缩写
    datetime = ymd_hms(paste(X1, X2, X3, X4), locale = locale(date_names = "en")),
    # 直接取第7列的数值内容转换为数值型
    avg_dur = as.numeric(X7)
  ) %>%
  select(datetime, avg_dur)

解法2:正则匹配直接提取目标内容

如果行格式固定,无需处理多余拆分列,代码更简洁:

library(readr)
library(stringr)

# 先读取所有行为字符向量
raw_lines <- read_lines("myFile.txt")

# 用正则分组分别匹配日期时间和对应数值
match_res <- str_match(raw_lines, "^(\\d{4} [A-Za-z]{3} \\d{2} \\d{2}:\\d{2}:\\d{2})\\s+avg_dur\\s+=\\s+(\\d+\\.\\d+)")

# 转换为数据框并设置对应类型
df <- data.frame(
  datetime = parse_datetime(match_res[,2], format = "%Y %b %d %H:%M:%S", locale = locale(date_names = "en")),
  avg_dur = as.numeric(match_res[,3])
)

注:如果你的系统默认locale为非英文,运行前可以先执行Sys.setlocale("LC_TIME", "English")避免月份缩写解析失败。

内容的提问来源于stack exchange,提问作者Stefano Bossi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 09:24:03