将YYYY-MM-DD更改为三个不同的列

时间:2018-06-07 15:43:08

标签: r datetime

我正在努力寻找有关将日期更改为三列的信息。

当前数据:

      Date
2018-06-07
2017-03-01
2015-11-30

期望的结果

Year  Month  Day
2018     06   07
2017     03   01
2015     11   30

3 个答案:

答案 0 :(得分:3)

1)chron 由于没有重复指定输入,我们假设:

Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")

在这种情况下这可行 - 如果列顺序无关紧要,您可以省略[...]部分:

library(chron)
do.call("cbind", month.day.year(Dates)[c("year", "month", "day")])

提供此矩阵(如果您需要数据框,请使用data.frame代替cbind):

     year month day
[1,] 2018     6   7
[2,] 2017     3   1
[3,] 2015    11  30

如果日期属于"Date"类,则上述代码也可以使用。

2)格式(基础)

DatestoNum <- function(fmt) as.numeric(format(as.Date(Dates), fmt))
sapply(c(year = "%Y", month = "%m", day = "%d"), DatestoNum)

给出相同的结果。如果Dates属于"Date"级,这也可以使用。在这种情况下,您可以选择删除as.Date。如果您更喜欢数据框结果,请在结果上使用as.data.frame

2a)或者将其写出来:

cbind(year = DatestoNum("%Y"), month = DatestoNum("%m"), day = DatestoNum("%d"))

3)lubridate

library(lubridate)

cbind(year = year(Dates), month = month(Dates), day = day(Dates))

4)read.table(base)

read.table(text = format(Dates), sep = "-", col.names = c("year", "month", "day"))

如果Dates已经是字符,您可以选择省略format

答案 1 :(得分:0)

 Dates <- c("2018-06-07", "2017-03-01", "2015-11-30")
> scan(text=Dates, what=list(Year="",Month="",Day=""), sep="-")
Read 3 records
$Year
[1] "2018" "2017" "2015"

$Month
[1] "06" "03" "11"

$Day
[1] "07" "01" "30"

这样就可以在&#34;数据框&#34;布置:

data.frame( scan(text=Dates, what=list(Year="",Month="",Day=""),
                 sep="-", quiet=TRUE) )
#-------
  Year Month Day
1 2018    06  07
2 2017    03  01
3 2015    11  30

如果这些值已经是数据框或列表中的日期(或因子)分类变量,那么您需要as.character强制Date列才能成功。

答案 2 :(得分:0)

用户似乎只是将日期保留为需要在分隔符上拆分的字符串。在这种情况下,使用tidyr::separate是最简单的解决方案:

library(tidyverse)
Dates <- data.frame(id = c('a', 'b', 'c'),
                    date = c("2018-06-07", "2017-03-01", "2015-11-30"))
Dates %>%
    separate(date, c("Year","Month","Day"))

  id Year Month Day
1  a 2018    06  07
2  b 2017    03  01
3  c 2015    11  30

更安全的解决方案可能是将日期存储为某种日期对象。在这种情况下,您可能希望使用@ G.Grothendieck发布的解决方案。