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

在R中如何按时间部分对DataFrame的时间戳列排序?

问题:按时间戳的时间部分对DataFrame排序

首先确认你的输入数据:

structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L))

你期望的是忽略日期,只按小时+分钟的时间部分排序,得到这样的结果:

05/06/2016 21:13 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50 05/06/2016 22:52 05/06/2016 22:58

你之前用lubridate的dmy_hm转换后直接排序无效,是因为转换后的是完整的日期时间对象,排序时会同时考虑日期和时间,而你要的是只基于时间部分排序。下面是两种可行的解决方法:


方法一:使用dplyr + lubridate

这个方法更简洁,适合熟悉tidyverse的用户:

library(lubridate)
library(dplyr)

# 加载你的数据
data <- structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L))

# 转换日期时间、提取时间部分并排序
data_sorted <- data %>%
  # 将因子型的Time.stamp转为日期时间对象
  mutate(datetime = dmy_hm(Time.stamp),
         # 提取时间部分(格式为HH:MM)
         time_part = format(datetime, "%H:%M")) %>%
  # 按时间部分排序
  arrange(time_part)

# 查看排序后的结果
data_sorted$Time.stamp

运行后会输出你想要的顺序:

[1] 05/06/2016 21:13 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50 05/06/2016 22:52 05/06/2016 22:58
Levels: 05/06/2016 21:13 05/06/2016 22:52 05/06/2016 22:58 09/06/2016 22:40 09/06/2016 22:45 09/06/2016 22:50

方法二:使用Base R(无需额外加载dplyr)

如果你更习惯base R的写法,可以用这个:

library(lubridate)

# 加载数据
data <- structure(list(Time.stamp = structure(1:6, .Label = c("05/06/2016 21:13", "05/06/2016 22:52", "05/06/2016 22:58", "09/06/2016 22:40", "09/06/2016 22:45", "09/06/2016 22:50"), class = "factor")), .Names = "Time.stamp", class = "data.frame", row.names = c(NA, -6L))

# 转换为日期时间对象
data$datetime <- dmy_hm(data$Time.stamp)
# 提取时间部分
data$time_part <- format(data$datetime, "%H:%M")
# 按时间部分排序
data_sorted <- data[order(data$time_part), ]

# 查看结果
data_sorted$Time.stamp

为什么你之前的方法无效?

你之前直接用dmy_hm转换后排序,是对完整的日期时间对象排序,比如05/06/2016 22:52的日期早于09/06/2016 22:40,所以完整排序时会把前者放在前面,但你需要的是忽略日期,只按小时分钟排序,因此必须先提取出时间部分,再基于这个字段排序。

内容的提问来源于stack exchange,提问作者Krishna Moorthy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:32:49