在R中更改日期格式
我在R中有一些非常简单的数据,需要更改其日期格式:在R中更改日期格式,r,date,format,strptime,r-faq,R,Date,Format,Strptime,R Faq,我在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
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
与%d/%m/%Y
不同,我希望它采用%Y-%m-%d
的标准R格式
我怎样才能做这个改变?我试过:
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
谢谢 这里有两个步骤:
- 解析数据。您的示例不是完全可复制的,是文件中的数据,还是文本或因子变量中的变量?假设是后者,那么如果您将data.frame称为X,则可以
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>
R>nzd-nzd
中天
1 31/08/2011 0.8378
2 31/07/2011 0.8457
3 30/06/2011 0.8147
R> 新西兰元$newdate新西兰元$txtdate新西兰元
日期中间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>
第三列和第四列之间的区别在于类型:
newdate
是类Date
,而txtdate
是字符。通过textConnection
读取数据后,以下操作似乎有效:
dat <- read.table(textConnection(txt), header = TRUE)
dat$date <- strptime(dat$date, format= "%d/%m/%Y")
format(dat$date, format="%Y-%m-%d")
> format(dat$date, format="%Y-%m-%d")
[1] "2011-08-31" "2011-07-31" "2011-06-30" "2011-05-31" "2011-04-30" "2011-03-31"
[7] "2011-02-28" "2011-01-31" "2010-12-31" "2010-11-30" "2010-10-31" "2010-09-30"
[13] "2010-08-31" "2010-07-31" "2010-06-30" "2010-05-31" "2010-04-30" "2010-03-31"
[19] "2010-02-28" "2010-01-31" "2009-12-31" "2009-11-30" "2009-10-31"
> str(dat)
'data.frame': 23 obs. of 2 variables:
$ date : POSIXlt, format: "2011-08-31" "2011-07-31" "2011-06-30" ...
$ midpoint: num 0.838 0.846 0.815 0.797 0.788 ...
dat str(dat)
“data.frame”:23 obs。共有2个变量:
$date:POSIXlt,格式:“2011-08-31”“2011-07-31”“2011-06-30”。。。
$midpoint:数值0.8380.8460.8150.7970.788。。。
我相信
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
nzd$date您也可以使用lubridate
软件包中的parse_date_time
功能:
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
库(lubridate)
day这真的很容易使用lubridate包装。你所要做的就是告诉R你的约会已经采用了什么格式。然后将其转换为标准格式
nzd$date使用一行将日期转换为首选格式:
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
nzd$date嗯,这对于一个noob来说似乎非常复杂。最后,我只是在excel中更改了格式,并将csv文件读回R。我想知道如何在R中轻松更改它,以防我有一个更大的文件,但这似乎并不像应该的那么简单。这并不是对您的解决方案的轻视,我只是希望它更简单(可能是一种在不创建新列的情况下转换原始列的方法)。有没有办法先改变类然后格式化它?@Yuri-这基本上就是Dirk的答案告诉你的方法,尽管他在这一过程中创建了一些新的专栏,这样你就可以很容易地看到“幕后”发生了什么。我建议您逐行浏览他的示例,在每行之间插入一个str(x)
,这样您就可以看到行动中的差异。@Chase谢谢,出于教学目的,我非常感谢额外的专栏,它帮助我看到了课堂差异和格式;所以谢谢你!很高兴知道,附加列的额外步骤并不是绝对必要的。谢谢你们两位!同意,但它依赖于magic(默认格式),因此显示不同的步骤是有益的。我确实对此处引用的数据帧中的POSIXlt有一个问题:当我尝试在ggplot中将日期绘制为x轴时,我收到了这个错误——if(长度(范围)==1 | |差异(范围)==0)中的错误{:缺少需要TRUE/FALSE的值--我如何在POSIXct中得到这个值?@Yuri-类似于as.POSIXct(otherstufghere)
的东西可能会起作用。感谢你的链接,我没有注意到Hadley提出的那些问题。
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
nzd$date <- format(as.Date(nzd$date), "%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
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")