在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

我在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
%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")