日期分为R

时间:2016-04-04 15:21:57

标签: r date

我有一个这样的数据框:

Date
20130101
20130102
20130103
20130104

我如何在不同的列中拆分Date列? 我已经使用了以下功能,但它无法正常工作:

library(data.table)  
setDT(DF)[, tstrsplit(DATE, "/|\\s", type.convert = TRUE)]

3 个答案:

答案 0 :(得分:2)

以下是一些不需要任何软件包的解决方案。它们都生成一个data.frame,其中包含"Date"类列,后跟年,月,日的数字列。 (可重复使用的输入在最后的注释中给出。)

1)POSIXlt 首先将Date列转换为"Date"类给出date,然后转换为未展开的"POSIXlt"对象,给出{{1} }}。现在适当地选择lt的元素:

lt

,并提供:

date <- as.Date(as.character(DF$Date), format = "%Y%m%d")
lt <- unclass(as.POSIXlt(date))
with(lt, data.frame(Date = date, year = year + 1900, month = mon + 1, day = mday))

2)格式

        Date year month day
1 2013-01-01 2013     1   1
2 2013-01-02 2013     1   2
3 2013-01-03 2013     1   3
4 2013-01-04 2013     1   4

,并提供:

data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
           year = as.numeric(format(date, "%Y")), 
           month = as.numeric(format(date, "%m")), 
           day = as.numeric(format(date, "%d")))

3)数学

        date year month day
1 2013-01-01 2013     1   1
2 2013-01-02 2013     1   2
3 2013-01-03 2013     1   3
4 2013-01-04 2013     1   4

,并提供:

with(DF, data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
                    year = Date %/% 10000, 
                    month = Date %% 10000 %/% 100, 
                    day = Date %% 100))   

4)read.fwf

        date year month day
1 2013-01-01 2013     1   1
2 2013-01-02 2013     1   2
3 2013-01-03 2013     1   3
4 2013-01-04 2013     1   4

,并提供:

data.frame(date = as.Date(as.character(DF$Date), format = "%Y%m%d"),
           read.fwf(textConnection(as.character(DF$Date)), c(4, 2, 2),
                    col.names = c("year", "month", "day")))

5)sub / read.table

        date year month day
1 2013-01-01 2013     1   1
2 2013-01-02 2013     1   2
3 2013-01-03 2013     1   3
4 2013-01-04 2013     1   4

,并提供:

date.ch <- sub("(....)(..)(..)", "\\1-\\2-\\3", DF$Date)
data.frame(date = as.Date(date.ch), 
           read.table(text = date.ch, col.names = c("year", "month", "day"), sep = "-"))

注意:使用的输入 date year month day 1 2013-01-01 2013 1 1 2 2013-01-02 2013 1 2 3 2013-01-03 2013 1 3 4 2013-01-04 2013 1 4 ,可重现的形式为:

"DF"

答案 1 :(得分:0)

如果您未开始使用data.table,则可以使用包含substr的以下命令:

x = data.frame("20130101", "20130102", "20130103", "20130104")

y<-data.frame(Year=substr(x[,1],1,4),
              Month=substr(x[,1],5,6),
              Day=substr(x[,1],7,8))

如果您确定您的数据与整个矢量的格式相同。

答案 2 :(得分:0)

您也可以使用lubridate

执行此操作
library(dplyr)
library(lubridate)

data = 
  data_frame(Date = c(20130101, 20130102, 20130103, 20130104) ) %>%
  mutate(date = 
           Date %>%
           as.character %>% 
           ymd,
         year = year(date),
         month = month(date),
         day = day(date))