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

在R中使用cols_only将字符列转为DateTime时出现NA值问题

问题描述

尝试在R中使用read_csv的cols_only参数指定列类型,仅需转换started_at和total_ride_time列。其中total_ride_time转换成功,但started_at列全部变为NA,尝试过POSIXct方法仍无效。

数据样本

ride_id rideable_type   started_at  ended_at    total_ride_time day_of_week start_station_name  start_station_id    end_station_name    end_station_id  start_lat   start_lng   end_lat end_lng member_casual
550CF7EFEAE0C618    electric_bike   8/7/22 9:34 PM  8/7/22 9:41 PM  0:07:31 2                   41.93   -87.69  41.94   -87.72  casual
DAD198F405F9C5F5    electric_bike   8/8/22 2:39 PM  8/8/22 2:53 PM  0:14:02 2                   41.89   -87.64  41.92   -87.64  casual
E6F2BC47B65CB7FD    electric_bike   8/8/22 3:29 PM  8/8/22 3:40 PM  0:10:44 2                   41.97   -87.69  41.97   -87.66  casual
F597830181C2E13C    electric_bike   8/8/22 2:43 AM  8/8/22 2:58 AM  0:15:03 1                   41.94   -87.65  41.97   -87.69  casual
0CE689BB4E313E8D    electric_bike   8/7/22 8:24 PM  8/7/22 8:29 PM  0:05:52 2                   41.85   -87.65  41.84   -87.66  casual

原代码

trip_data_202208 <- read_csv(("202208_divvy_tripdata.csv"), 
  col_types = cols_only(ride_id = col_character(), 
  rideable_type = col_character(), started_at = col_datetime(), 
  ended_at = col_character(), 
  total_ride_time = col_time(format = ""), 
  day_of_week = col_character(), 
  start_station_name = col_character(), 
  start_station_id = col_character(), 
  end_station_name = col_character(), 
  end_station_id = col_character(), 
  start_lat = col_double(), 
  start_lng = col_double(), end_lat = col_double(), 
  end_lng = col_double(),member_casual = col_character() 
    )
      )
解决方案

问题原因

col_datetime()默认只识别ISO标准格式的日期时间(如YYYY-MM-DD HH:MM:SS),但你的started_at列格式是月/日/年 时:分 上/下午(例如8/7/22 9:34 PM),格式不匹配导致解析失败,生成NA。

修改后的代码

指定started_at的解析格式即可解决问题,调整后的代码如下:

trip_data_202208 <- read_csv("202208_divvy_tripdata.csv", 
  col_types = cols_only(
    ride_id = col_character(), 
    rideable_type = col_character(), 
    started_at = col_datetime(format = "%m/%d/%y %I:%M %p"), # 关键:指定匹配的格式
    ended_at = col_character(), 
    total_ride_time = col_time(format = ""), 
    day_of_week = col_character(), 
    start_station_name = col_character(), 
    start_station_id = col_character(), 
    end_station_name = col_character(), 
    end_station_id = col_character(), 
    start_lat = col_double(), 
    start_lng = col_double(), 
    end_lat = col_double(), 
    end_lng = col_double(),
    member_casual = col_character() 
  )
)

格式参数说明

  • %m:两位数字的月份(自动兼容一位格式)
  • %d:两位数字的日期(自动兼容一位格式)
  • %y:两位数字的年份(如22对应2022年)
  • %I:12小时制的小时数
  • %M:分钟数
  • %p:上/下午标识(AM/PM)

验证方法

读取数据后,运行以下代码确认started_at的类型和值:

# 查看列类型
str(trip_data_202208$started_at)
# 查看前几行数据
head(trip_data_202208$started_at)

内容的提问来源于stack exchange,提问作者Izzy Fraraccio

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:55:31