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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 05:07:20