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"
ありがとう!
ここには2つのステップがあります。
_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>
_
列3と列4の違いは、タイプです:newdate
はクラスDate
ですが、txtdate
は文字です。
nzd$date <- format(as.Date(nzd$date), "%Y/%m/%d")
上記のコードには、2つの間違いがあります。まず第一に、nzd$date
の中のas.Date
を読んでいるとき、どの形式でdate
を供給しているかについて言及していません。それで、それはそれを読むためにそれがデフォルトのセット形式であろうと試みます。 help
doc、?as.Date
が表示された場合、表示されます
フォーマット
文字列。指定しない場合、最初の非NA要素で「%Y-%m-%d」、次に「%Y /%m /%d」を試行し、どちらも機能しない場合はエラーを返します。それ以外の場合、処理はstrptimeを介して行われます
2番目の間違いは、format
内で%Y-%m-%d
と書いた"%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
の最初の引数は日付ベクトルを指定し、2番目の引数はフォーマットが発生する順序を指定します。 orders
引数は、parse_date_time
を非常に柔軟にします。
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 ...
1行を使用して日付を優先形式に変換します。
nzd$date <- format(as.Date(nzd$date, format="%d/%m/%Y"),"%Y/%m/%d")
これは、パッケージlubridateを使用すると本当に簡単です。あなたがしなければならないことは、あなたの日付がすでにどの形式であるかをRに伝えることです。それからそれを標準形式に変換します
nzd$date <- dmy(nzd$date)
それでおしまい。
私は信じている
nzd$date <- as.Date(nzd$date, format = "%d/%m/%Y")
十分なものです。