web-dev-qa-db-ja.com

Rで文字を日付に変換する

私は比較的Rに慣れていませんが、日付の変換を処理する必要があるのはこれが初めてです。 (read.table()を使用して)CSVからデータを読み取りましたが、問題を強調するためにデータを短縮しました。 Rに読み込まれると、日付フィールドは文字です。

簡単に言えば、いくつかのインスタンスを除き、ほとんどの日付は正しく強制されます。以下の例は、何が起こっているかを示しています。

# my attempt to coerce the date -- uses the stringr package
prods.all$Date2 <- as.Date(str_sub(prods.all$Date, 1, 
                str_locate(prods.all$Date, " ")[1]-1), 
                "%m/%d/%Y")

# grab two rows to highlight my issue
temp <- prods.all[c(1925:1926), c(1,8)]

> temp
                   Date      Date2
1925  10/9/2009 0:00:00 2009-10-09
1926 10/15/2009 0:00:00 0200-10-15

ご覧のとおり、一部の日付の年は不正確です。このパターンは、日が2桁のときに発生するようです。

数冊の本を調べて、より良い方法でグーグルを試しましたが、すべてが私のデータが入力時に正しくフォーマットされていないことを示唆しているようです。

Rがどれほど強力かを考えると、列を有効な日付に強制する非常に簡単な方法があり、非常に明白な解決策を見落としていると思います。

あなたが提供できる助けは大歓迎です。

26
Btibert3

あなたは物事を複雑にしているかもしれませんが、stringrパッケージが必要な理由はありますか?

 df <- data.frame(Date = c("10/9/2009 0:00:00", "10/15/2009 0:00:00"))
 as.Date(df$Date, "%m/%d/%Y %H:%M:%S")

[1]「2009-10-09」「2009-10-15」

より一般的に、時間コンポーネントも必要な場合は、strptimeを使用します。

strptime(df$Date, "%m/%d/%Y %H:%M:%S")

私はあなたが与える部分的な結果からあなたの実際のデータが何を見るかもしれないか推測しています。

46
mdsumner

最も簡単な方法は、潤滑油を使用することです。

library(lubridate)
prods.all$Date2 <- mdy(prods.all$Date2)

この関数は、クラスPOSIXctのオブジェクトを自動的に返し、因子または文字のいずれかで動作します。

58
hadley