如何在R中将带AM/PM的字符型日期时间转为24小时制并拆分列?
解决R中带AM/PM的字符型日期时间转换与拆分问题
1. 正确解析带AM/PM的日期时间字符串
你的问题出在format参数设置错误:原代码用%H(24小时制小时),但你的数据是12小时制加AM/PM标识,需改用%I(12小时制小时)配合%p(AM/PM标识符)解析,或者用lubridate包的便捷函数自动识别格式:
# 方式1:base R的as.POSIXct手动指定格式 h_Calories <- h_Calories %>% mutate(ActivityHour = as.POSIXct(ActivityHour, format = "%m/%d/%Y %I:%M:%S %p", tz = "UTC")) # 方式2:lubridate的mdy_hms自动识别12小时制格式(tidyverse已包含该包) h_Calories <- h_Calories %>% mutate(ActivityHour = mdy_hms(ActivityHour, tz = "UTC"))
注:
tz参数建议指定时区(如"UTC"或本地时区),避免后续分析出现时区歧义。
2. 拆分日期时间为多列
解析完成后,可通过lubridate的提取函数拆分出年、月、日、24小时制小时等列,满足后续分析需求:
h_Calories <- h_Calories %>% mutate( # 提取日期部分 date = as.Date(ActivityHour), # 提取年、月、日 year = year(ActivityHour), month = month(ActivityHour, label = TRUE), # label=TRUE返回月份缩写(如Apr) day = day(ActivityHour), # 提取24小时制小时、分钟 hour_24 = hour(ActivityHour), minute = minute(ActivityHour) )
执行后数据集示例输出:
# A tibble: 3 × 7 ActivityHour date year month day hour_24 minute <dttm> <date> <dbl> <ord> <int> <int> <int> 1 2016-04-12 00:00:00 2016-04-12 2016 Apr 12 0 0 2 2016-05-12 01:00:00 2016-05-12 2016 May 12 1 0 3 2016-06-12 13:00:00 2016-06-12 2016 Jun 12 13 0
完整可复现代码
library(tidyverse) # 模拟数据集 h_Calories <- tibble( ActivityHour = c("4/12/2016 12:00:00 AM", "5/12/2016 1:00:00 AM", "6/12/2016 1:00:00 PM")) # 解析日期时间并拆分列 h_Calories <- h_Calories %>% mutate(ActivityHour = mdy_hms(ActivityHour, tz = "UTC")) %>% mutate( date = as.Date(ActivityHour), year = year(ActivityHour), month = month(ActivityHour, label = TRUE), day = day(ActivityHour), hour_24 = hour(ActivityHour), minute = minute(ActivityHour) ) # 查看结果 print(h_Calories)
内容的提问来源于stack exchange,提问作者user22175896
相关产品推荐
相关产品推荐

