在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
相关产品推荐
相关产品推荐

