将日期数据(m / d / y)拆分为3个单独的列

时间:2010-11-02 14:11:08

标签: r date

我需要将日期(m / d / y格式)转换为3个单独的列,我希望在其中运行算法。(我正在尝试将日期转换为Julian Day Numbers)。为另一个用户看到了这个建议,使用Oracle将数据分成多个列。我正在使用R而且我一直坚持如何恰当地编码。 A1,A2 ......代表我的新列标题,与“更新集”部分的格式差异是什么?

 update <tablename> set A1 = substr(ORIG, 1, 4), 
                       A2 = substr(ORIG, 5, 6), 
                       A3 = substr(ORIG, 11, 6), 
                       A4 = substr(ORIG, 17, 5); 

我正在努力提高我在R中的技能,但无法想象这一点...任何帮助都非常感激。在此先感谢... :)

5 个答案:

答案 0 :(得分:21)

我使用format()方法将Date个对象拉开R中的日期。使用Dirk的datetext,这就是我如何将日期分解为其组成部分:

datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10")
datetxt <- as.Date(datetxt)
df <- data.frame(date = datetxt,
                 year = as.numeric(format(datetxt, format = "%Y")),
                 month = as.numeric(format(datetxt, format = "%m")),
                 day = as.numeric(format(datetxt, format = "%d")))

给出了:

> df
        date year month day
1 2010-01-02 2010     1   2
2 2010-02-03 2010     2   3
3 2010-09-10 2010     9  10

注意其他几个人所说的;您可以在不拆分各种日期组件的情况下获取Julian日期。我添加了这个答案,以展示如果你需要别的东西,你可以如何分手。

答案 1 :(得分:9)

给定一个文本变量x,如下所示:

> x
[1] "10/3/2001"

然后:

> as.Date(x,"%m/%d/%Y")
[1] "2001-10-03"

将其转换为日期对象。然后,如果你需要它:

> julian(as.Date(x,"%m/%d/%Y"))
[1] 11598
attr(,"origin")
[1] "1970-01-01"

给出朱利安日期(相对于1970-01-01)。

不要尝试子串事件......

有关详情,请参阅help(as.Date)。

答案 2 :(得分:6)

快速的:

  1. 基础R中已存在Julian日期转换器,例如参见help(julian)

  2. 一种方法可能是将日期解析为POSIXlt,然后读取组件。其他日期/时间类和包也可以使用,但基础R有一些内容。

  3. 将日期解析为字符串几乎总是一种不好的方法。

  4. 以下是一个例子:

    datetxt <- c("2010-01-02", "2010-02-03", "2010-09-10")
    dates <- as.Date(datetxt) ## you could examine these as well
    plt <- as.POSIXlt(dates)  ## now as POSIXlt types
    plt[["year"]] + 1900      ## years are with offset 1900
    #[1] 2010 2010 2010
    plt[["mon"]] + 1          ## and months are on the 0 .. 11 intervasl
    #[1] 1 2 9
    plt[["mday"]] 
    #[1]  2  3 10
    df <- data.frame(year=plt[["year"]] + 1900, 
                      month=plt[["mon"]] + 1, day=plt[["mday"]])
    df
    #  year month day
    #1 2010     1   2
    #2 2010     2   3
    #3 2010     9  10
    

    当然

    julian(dates)
    #[1] 14611 14643 14862
    #attr(,"origin")
    #[1] "1970-01-01"
    

答案 3 :(得分:1)

嗨Gavin:[使用你的想法]的另一种方式是:

我们将使用的数据框架是石油库,其中包含与石油和天然气库存随时间变化相关的各种变量。 变量是:

colnames(stocks)
"bpV"    "bpO"    "bpC"    "bpMN"   "bpMX"   "emdate" "emV"    "emO"    "emC"  
"emMN"   "emMN.1" "chdate" "chV"    "cbO"    "chC"    "chMN"   "chMX" 

要做的第一件事就是将emdate字段(整数向量)更改为日期向量。

realdate<-as.Date(emdate,format="%m/%d/%Y")

接下来,我们要使用您提供的想法将emdate列拆分为三个单独的列,分别代表月,日和年。

> dfdate <- data.frame(date=realdate)
year=as.numeric (format(realdate,"%Y"))
month=as.numeric (format(realdate,"%m"))
day=as.numeric (format(realdate,"%d"))

ls()将包含各个向量,日,月,年和dfdate。 现在将dfdate,day,month,year合并到原始数据框[stock]中。

ostocks<-cbind(dfdate,day,month,year,stocks)
colnames(ostocks)

"date"   "day"    "month"  "year"   "bpV"    "bpO"    "bpC"    "bpMN"   "bpMX"   "emdate" "emV"    "emO"    "emC"    "emMN"   "emMX" "chdate" "chV"   
"cbO"    "chC"    "chMN"   "chMX"

类似的结果,我也有日期,日,月,年作为df之外的单独向量。

答案 4 :(得分:0)

要将日期(m / d / y格式)转换为3个单独的列,请考虑df,

df <- data.frame(date = c("01-02-18", "02-20-18", "03-23-18"))
df
      date
1 01-02-18
2 02-20-18
3 03-23-18

转换为日期格式

df$date <- as.Date(df$date, format="%m-%d-%y")
df
        date
1 2018-01-02
2 2018-02-20
3 2018-03-23

要获得三个分别包含年,月和日的列,

library(lubridate)
df$year <- year(ymd(df$date))
df$month <- month(ymd(df$date)) 
df$day <- day(ymd(df$date))
df
        date year month day
1 2018-01-02 2018     1   2
2 2018-02-20 2018     2  20
3 2018-03-23 2018     3  23

希望这会有所帮助。