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

