簡體   English   中英

在 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

而不是%d/%m/%Y ,我希望它采用標准 R 格式%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> 

第三列和第四列之間的區別在於類型: newdateDate類,而txtdate是字符。

nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")

在上面的代碼中,有兩個錯誤。 首先,當您在as.Date中閱讀nzd$date時,您並沒有提及您以什么格式輸入date 因此,它會嘗試使用默認設置格式來讀取它。 如果您看到help文檔,您將看到?as.Date

格式
一個字符串。 如果未指定,它將在第一個非 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

您還可以使用lubridate包中的parse_date_time函數:

library(lubridate)
day<-"31/08/2011"
as.Date(parse_date_time(day,"dmy"))
[1] "2011-08-31"

parse_date_time返回一個 POSIXct 對象,所以我們使用as.Date來獲取一個日期對象。 parse_date_time的第一個參數指定日期向量,第二個參數指定格式出現的順序。 orders參數使parse_date_time非常靈活。

使用包 lubridate 真的很容易。 您所要做的就是告訴 R 您的日期已經是什么格式。然后它將其轉換為標准格式

nzd$date <- dmy(nzd$date)

而已。

通過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 ...

使用一行將日期轉換為首選格式:

nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")

我相信

nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")

足夠了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM