如何在 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
>
按预期安排了时间戳。
order
和 dplyr::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)
我有一个包含 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
>
按预期安排了时间戳。
order
和 dplyr::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)