将AllData数据集started_at列转为日期格式并提取日/月/小时字段
解决方案
先看你的数据集预览:
ride_id rideable_type started_at ended_at member…¹ <chr> <chr> <chr> <chr> <chr> 1 C2F7DD78E82EC875 electric_bike 1/13/2022 11:59 1/13/2022 12:02 casual 2 A6CF8980A652D272 electric_bike 1/10/2022 8:41 1/10/2022 8:46 casual 3 BD0F91DFF741C66D classic_bike 1/25/2022 4:53 1/25/2022 4:58 member 4 CBB80ED419105406 classic_bike 1/4/2022 0:18 1/4/2022 0:33 casual 5 DDC963BFDDA51EEA classic_bike 1/20/2022 1:31 1/20/2022 1:37 member 6 A39C6F6CC0586C0B classic_bike 1/11/2022 18:48 1/11/2022 18:51 member
你用as.Date()失败的原因有两个:一是started_at包含日期+时间,as.Date()默认只处理日期部分;二是你的日期格式是月/日/年 时:分,不是as.Date()默认的年-月-日格式,必须指定解析规则。
下面提供两种常用解决方法:
方法一:Base R 实现
- 转换为日期时间格式:用
as.POSIXct()指定格式字符串"%m/%d/%Y %H:%M" - 提取日、月、小时:用
format()函数提取对应字段
# 转换started_at为日期时间格式 AllData$started_at <- as.POSIXct(AllData$started_at, format = "%m/%d/%Y %H:%M") # 新增列提取日、月、小时 AllData$start_day <- format(AllData$started_at, "%d") AllData$start_month <- format(AllData$started_at, "%m") AllData$start_hour <- format(AllData$started_at, "%H")
方法二:Tidyverse + Lubridate 实现(更简洁)
Lubridate包专门处理日期时间,无需手动写格式字符串,可直接识别月/日/年 时:分格式:
library(tidyverse) library(lubridate) AllData <- AllData %>% # 解析started_at为日期时间格式 mutate(started_at = mdy_hm(started_at), # 提取日、月、小时 start_day = day(started_at), start_month = month(started_at), start_hour = hour(started_at))
注:如果需要提取的日/月为数值格式(而非字符串),Base R方法可加as.numeric()转换,Lubridate的day()/month()函数默认返回数值。
内容的提问来源于stack exchange,提问作者Muaaz Ahmad
相关产品推荐
相关产品推荐

