在R数据框列中排序日期时间字符串

时间:2014-09-16 18:07:01

标签: r datetime dplyr

我的数据框Time中有df列,其类型为字符。

Arrange()包中使用dplyr后,我的Time列的排序方式如下:

D1W12001
D1W12002
...
D1W22001
D1W22002
...
D2W12001
D2W12002
...

但我需要按时间顺序排序为:

D1W12001
D2W12001
D3W12001
...

实现这一目标的最佳方法是什么? 我可以在相反的方向(从左到右)对字符串进行排序吗? 或者我是否需要先将我的列转换为日期时间对象?用于此的最佳软件包是什么?

更新

我想我没有很好地提出这个问题。让我澄清一下。

让我们假设时间是随机的,格式为DxWxYear,其中D是日,W是星期,年是年。 一周有5天,一年有52周,2001年到2011年有几年。

这些"次"是字符串。

所以我的无序数据可能如下:

D4W72002
D2W32009
D5w372001
D2w152003
...
对于许多行,

继续这样..

现在我需要按时间顺序排列,例如:

D1W12001
D2W12001
D3W12001
D4W12001
D5W12001
D1W22001
D2W22001
...
D4W522011
D5W522011

现在我怎样才能订购我的时代?

执行order()Arrange()将它们排序为字符串,因此它会从右侧递增它们,所以它看起来如下所示:

D1W12001
D1W12002
D1W12003
D1W12004
D1W12005
...

这不是我需要的。

2 个答案:

答案 0 :(得分:0)

使用日期格式可能有办法做到这一点,但我没有看到。我尝试使用strftime(),但似乎一年中一周的格式预计会领先零。我研究了在lubridate包中使用parse_date_time(),但是工作日的格式是期望值0-6而不是1-7。

所以,我使用substring()strsplit()来修剪年份,然后将剩余部分分成两部分。

nc <- nchar(df$Time)
year <- substring(df$Time, nc-3, nc)
dw <- strsplit(substring(df$Time, 2, nc-4), "W")
day <- as.numeric(sapply(dw, "[", 1))
week <- as.numeric(sapply(dw, "[", 2))
ord <- order(year, week, day)

df[ord, ]

答案 1 :(得分:-1)

我写了一个反向函数来改变字符串的顺序,这样正常的sort()函数就可以了。

stringReverse <- function(x) {
  d <- substring(x$Time, 1, 2)
  w <- substring(x$Time, 3, 4)
  y <- substring(x$Time, 5, 8)
  return(paste(y,w,d,sep=""))
}

调用该函数替换Time中的df列:

df$Time <- stringReplace(df)

现在,我可以使用arrange()对我进行排序。

在使用不同的反向函数进行排列后,可以将Time字符串恢复为原来的字符串。