提问人:indigo 提问时间:9/16/2011 最后编辑:Henrikindigo 更新时间:7/7/2023 访问量:260721
在 R 中更改日期格式
Changing date format in R
问:
我在 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
而不是,我希望它采用标准的 R 格式%d/%m/%Y
%Y-%m-%d
如何进行此更改?我试过:
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
但这只是切断了这一年,并为这一天增加了零:
[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"
谢谢!
答:
这里有两个步骤:
- 解析数据。您的示例不是完全可重现的,是文件中的数据,还是文本或因子变量中的变量?让我们假设后者,那么如果你的 data.frame 被称为 X,你可以
X$newdate <- strptime(as.character(X$date), "%d/%m/%Y")
现在,该列的类型应为 。newdate
Date
- 设置数据格式。这是一个打电话或:
format()
strftime()
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>
第三列和第四列之间的区别在于类型:是类,而是字符。newdate
Date
txtdate
评论
str(x)
通过 读取数据后,以下方法似乎有效: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 ...
评论
as.POSIXct(otherStuffHere)
我相信
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
就足够了。
评论
您还可以使用包中的函数:parse_date_time
lubridate
library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"
parse_date_time
返回一个 POSIXct 对象,所以我们用来获取一个 date 对象。的第一个参数指定日期向量,第二个参数指定格式出现的顺序。这个论点非常灵活。as.Date
parse_date_time
orders
parse_date_time
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
在上面这段代码中,有两个错误。首先,当你在里面阅读时,你没有提到你以什么格式喂它。因此,它会尝试使用默认设置的格式来读取它。如果你看到这个文档,你会看到nzd$date
as.Date
date
help
?as.Date
format
字符串。如果未指定,它将尝试“%Y-%m-%d” 然后在第一个非 NA 元素上显示“%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
使用包装润滑剂非常容易。你所要做的就是告诉 R 你的日期已经采用什么格式。然后,它将其转换为标准格式
nzd$date <- dmy(nzd$date)
就是这样。
使用一行将日期转换为首选格式:
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
如果您的输入具有一致的日期格式,您可以尝试一个简单的解决方法:
sapply(date, function(x){paste(strsplit(x, '/')[[1]][c(3,2,1)], collapse = '/')})
评论
sapply(date, function(x){ifelse(is.na(x),NA,paste(strsplit(x, '/')[[1]][c(3,2,1)], collapse = '/'))})
上一个:查找星期几
评论