如何在 R 中对 POSIXct 日期时间格式进行排序?

How can I sort POSIXct datetime format in R?

我有一个包含 4 列的数据框,第一列称为 Date_et_heure。在该专栏中,我有一个格式为“%Y-%m-%d %H:%M:%S”的 POSIXct POSIXt class 日期时间。我想安排我的数据框,以便行始终按时间顺序排列。

我尝试使用 arrange() 函数,但它不能接受 POSIXct POSIXt 格式的数据;我总是收到错误消息:

Error in UseMethod("arrange") : no applicable method for 'arrange' applied to an object of class "c('POSIXct', 'POSIXt')

我尝试使用 order() 函数,为此我需要使用 as.Date() 函数转换 POSIXct。但是 as.Date() 会忽略列的时间格式("%H:%M:%S")。

有谁知道是否有一种方法可以订购 POSIXct class 数据?希望转换可靠。

谢谢!

POSIXct 在 R 中既有用又强大。在内部,它是 'just' 一个双精度值,您可以直接对它们使用所有常用操作。

这是一个最小的基础 R 演示:

> set.seed(123)    # reproducible
> v <- as.POSIXct(Sys.time() + rnorm(5)*3600)
> v                # random draw around 'now', not sorted
[1] "2021-11-09 06:05:15.009926 CST" "2021-11-09 06:25:04.083292 CST" 
[3] "2021-11-09 08:12:24.072185 CST" "2021-11-09 06:43:06.552463 CST" 
[5] "2021-11-09 06:46:38.158100 CST"
> diff(v)          # not sorted -> pos. and neg. differences
Time differences in mins
[1]  19.81789 107.33315 -89.29200   3.52676
>

所以这里用order()重新排列:

> w <- v[order(v)]
> w
[1] "2021-11-09 06:05:15.009926 CST" "2021-11-09 06:25:04.083292 CST" 
[3] "2021-11-09 06:43:06.552463 CST" "2021-11-09 06:46:38.158100 CST"
[5] "2021-11-09 08:12:24.072185 CST"
> diff(w)
Time differences in mins
[1] 19.81789 18.04115  3.52676 85.76523
> 

按预期安排了时间戳。

orderdplyr::arrange 都可以对 "POSIXct" 个对象进行排序。

i <- order(df1$Date_et_heure)
df1[i,]
#         Date_et_heure x
#1  2021-11-09 12:41:57 i
#2  2021-11-09 12:41:58 d
#3  2021-11-09 12:41:59 j
#4  2021-11-09 12:42:00 e
#5  2021-11-09 12:42:01 h
#6  2021-11-09 12:42:02 b
#7  2021-11-09 12:42:03 a
#8  2021-11-09 12:42:04 f
#9  2021-11-09 12:42:05 c
#10 2021-11-09 12:42:06 g

df1 |> dplyr::arrange(Date_et_heure)
#         Date_et_heure x
#1  2021-11-09 12:41:57 i
#2  2021-11-09 12:41:58 d
#3  2021-11-09 12:41:59 j
#4  2021-11-09 12:42:00 e
#5  2021-11-09 12:42:01 h
#6  2021-11-09 12:42:02 b
#7  2021-11-09 12:42:03 a
#8  2021-11-09 12:42:04 f
#9  2021-11-09 12:42:05 c
#10 2021-11-09 12:42:06 g

测试数据

set.seed(2021)
n <- 10
Date_et_heure <- Sys.time() + sample(n)
df1 <- data.frame(Date_et_heure, x = letters[1:n])

Post 您的代码,错误消息并不表示问题出在您提到的 class 的对象上,而是您为恰好具有 class 的对象提供了一个不适用的方法=17=] 在这种情况下。

问题不在于 dplyr 功能,如其他回复中的示例所示。

这里是 POSIXlt 和 POSIXct 的示例(它们都有 class“POSIXct”“POSIXt”)。您可以对两种方式进行排序。

df <- data.frame(
  Date_et_heurePOSIXct = sample(seq(as.POSIXct('2021-08-01'), as.POSIXct('2021-11-09', tz = "UTC"), by = "1 sec"), 5),
  Date_et_heurePOSIXlt = sample(seq(as.POSIXlt('2021-08-01'), as.POSIXlt('2021-11-09', tz = "UTC"), by = "1 sec"), 5)
)

df %>% arrange(Date_et_heurePOSIXct)
df %>% arrange(desc(Date_et_heurePOSIXct))
df %>% arrange(Date_et_heurePOSIXlt)
df %>% arrange(desc(Date_et_heurePOSIXlt))


class(df$Date_et_heurePOSIXct)
class(df$Date_et_heurePOSIXlt)