我需要将日期(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中的技能,但无法想象这一点...任何帮助都非常感激。在此先感谢... :)
答案 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)
快速的:
基础R中已存在Julian日期转换器,例如参见help(julian)
。
一种方法可能是将日期解析为POSIXlt,然后读取组件。其他日期/时间类和包也可以使用,但基础R有一些内容。
将日期解析为字符串几乎总是一种不好的方法。
以下是一个例子:
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
希望这会有所帮助。