如何按日期对数据框进行排序

70

我需要在 R 中按日期对数据框进行排序。 日期的格式都是 "dd/mm/yyyy"。 日期在第三列中,列标题为 V3。 我已经知道如何按列对数据框进行排序,也知道如何将字符串转换成日期值。 但是我不知道如何将它们结合起来以便按日期对数据框进行排序。

8个回答

161

@John,给这个答案点个赞怎么样? :) - Prasad Chalasani
如果我知道怎么做,我很乐意帮您,@Prasad Chalasani。 - John
@John,答案左侧有一个向上箭头,您需要单击它。如果您认为这是多个答案中最好的答案,还可以单击表示“已接受答案”的复选标记。 - Prasad Chalasani
@Prasad Chalasani 对不起,看来我没有足够的积分来投票。 - John
@John -- 啊,是的,我忘记了! - Prasad Chalasani
@John 如果这是正确的答案,请勾选我建议旁边的勾号,这样我就能获得被接受的答案信用。 - I82Much

35

现今使用 lubridate 和 dplyr 库是最有效和舒适的。

lubridate 包含许多函数,可以轻松地将日期解析为 POSIXctDate 对象。这里我们使用 dmy 自动解析以 Day, Month, Year 格式表示的日期。一旦你的数据格式为日期格式,你就可以按照需要使用 dplyr::arrange(或任何其他排序函数)对其进行排序:

d$V3 <- lubridate::dmy(d$V3)
dplyr::arrange(d, V3)

1
或者使用管道符:d %>% mutate(across(V3, dmy)) %>% arrange(V3) - mharinga

19

如果您希望按降序排序日期,减号在日期上不起作用。

out <- DF[rev(order(as.Date(DF$end))),]

然而,您可以使用一个通用函数rev()来达到相同的效果。因此,您可以将rev和order结合起来使用,如下所示:

#init data
DF <- data.frame(ID=c('ID3', 'ID2','ID1'), end=c('4/1/09 12:00', '6/1/10 14:20', '1/1/11 11:10')
#change order
out <- DF[rev(order(as.Date(DF$end))),]

希望它有所帮助。


5
你可以使用order()对日期数据进行排序。
# Sort date ascending order
d[order(as.Date(d$V3, format = "%d/%m/%Y")),]

# Sort date descending order
d[rev(order(as.Date(d$V3, format = "%d/%m/%y"))),]

希望这能够帮助到您,

我在 Quora 上的回答链接https://qr.ae/TWngCe

谢谢


2

我发现唯一的处理时间的方法是通过源代码中的美国格式(mm-dd-yyyy HH-MM-SS PM / AM)...

df_dataSet$time <- as.POSIXct( df_dataSet$time , format = "%m/%d/%Y %I:%M:%S %p" , tz = "GMT")
class(df_dataSet$time)
df_dataSet <- df_dataSet[do.call(order, df_dataSet), ] 

谢谢!我曾经苦苦挣扎于用POSIX格式日期排序,而这是唯一有效的解决方案。 - jls

2

如果你只是想在R等程序中将日期从最早到最新重新排列,你可以使用以下方法:

dataframe <- dataframe[nrow(dataframe):1,]

这使我不必在Excel中来回导入导出,只为了对Yahoo Finance数据进行排序。


1
你还可以使用dplyr库中的arrange。下面的代码片段将修改原始日期字符串为日期对象,并按日期排序。这是一个不错的方法,因为你将日期存储为日期,而不仅仅是字符组成的字符串。
dates <- dates %>%
  mutate(date = as.Date(date, "%d/%m/%Y")) %>%
  arrange(date)

如果您只想按字符串排序(通常是较差的选项),可以这样做:
dates <- dates %>%
  arrange(date = as.Date(date, "%d/%m/%Y"))

0
如果您有一个名为daily_data的数据集:
daily_data <- daily_data[order(as.Date(daily_data$date, format="%d/%m/%Y")),] 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接