A.K*_*ger 20 format r strptime date-conversion
我在R中有一些非常简单的数据,需要更改其日期格式:
date midpoint
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
4 31/05/2011 0.7970
5 30/04/2011 0.7877
6 31/03/2011 0.7411
7 28/02/2011 0.7624
8 31/01/2011 0.7665
9 31/12/2010 0.7500
10 30/11/2010 0.7734
11 31/10/2010 0.7511
12 30/09/2010 0.7263
13 31/08/2010 0.7158
14 31/07/2010 0.7110
15 30/06/2010 0.6921
16 31/05/2010 0.7005
17 30/04/2010 0.7113
18 31/03/2010 0.7027
19 28/02/2010 0.6973
20 31/01/2010 0.7260
21 31/12/2009 0.7154
22 30/11/2009 0.7287
23 31/10/2009 0.7375
Run Code Online (Sandbox Code Playgroud)
而不是%d/%m/%Y,我希望它在标准的R格式中%Y-%m-%d
我怎样才能做出这个改变?我试过了:
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
Run Code Online (Sandbox Code Playgroud)
但这只是切断了一年,并在当天增加了零:
[1] "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20"
[6] "0031/03/20" "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20"
[11] "0031/10/20" "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20"
[16] "0031/05/20" "0030/04/20" "0031/03/20" "0028/02/20" "0031/01/20"
[21] "0031/12/20" "0030/11/20" "0031/10/20" "0030/09/20" "0031/08/20"
[26] "0031/07/20" "0030/06/20" "0031/05/20" "0030/04/20" "0031/03/20"
[31] "0028/02/20" "0031/01/20" "0031/12/20" "0030/11/20" "0031/10/20"
[36] "0030/09/20" "0031/08/20" "0031/07/20" "0030/06/20" "0031/05/20"
Run Code Online (Sandbox Code Playgroud)
谢谢!
Dir*_*tel 46
这里有两个步骤:
Run Code Online (Sandbox Code Playgroud)X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")
现在该newdate列应该是类型Date.
format()或strftime():Run Code Online (Sandbox Code Playgroud)format(X$newdate, "%Y-%m-%d")
一个更完整的例子:
R> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"),
+ mid=c(0.8378,0.8457,0.8147))
R> nzd
date mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> nzd$newdate <- strptime(as.character(nzd$date), "%d/%m/%Y")
R> nzd$txtdate <- format(nzd$newdate, "%Y-%m-%d")
R> nzd
date mid newdate txtdate
1 31/08/2011 0.8378 2011-08-31 2011-08-31
2 31/07/2011 0.8457 2011-07-31 2011-07-31
3 30/06/2011 0.8147 2011-06-30 2011-06-30
R>
Run Code Online (Sandbox Code Playgroud)
第三列和第四列之间的区别在于:newdate类是类Date,txtdate而是字符.
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,有两个错误.首先,当你在nzd$date里面阅读时,as.Date你没有提到你正在以什么形式喂它date.因此,它尝试使用它的默认设置格式来读取它.如果您看到该help文档,?as.Date您将看到
format
一个字符串.如果未指定,它将在第一个非NA元素上尝试"%Y-%m-%d"然后"%Y /%m /%d",如果两个元素都不起作用则给出错误.否则,处理是通过strptime
第二个错误是:即使你想以%Y-%m-%d格式阅读,format你写的内部"%Y/%m/%d".
现在,正确的做法是:
> nzd <- data.frame(date=c("31/08/2011", "31/07/2011", "30/06/2011"),
+ mid=c(0.8378,0.8457,0.8147))
> nzd
date mid
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
> nzd$date <- format(as.Date(nzd$date, format = "%d/%m/%Y"), "%Y-%m-%d")
> head(nzd)
date mid
1 2011-08-31 0.8378
2 2011-07-31 0.8457
3 2011-06-30 0.8147
Run Code Online (Sandbox Code Playgroud)
您还可以使用包中的parse_date_time函数lubridate:
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
Run Code Online (Sandbox Code Playgroud)
parse_date_time返回POSIXct对象,因此我们使用它as.Date来获取日期对象。的第一个参数parse_date_time指定日期向量,第二个参数指定格式发生的顺序。该orders论点parse_date_time非常灵活。