44

日時の文字列を持つデータ フレームがあります。

を使用するas.Dateと、いくつかのインスタンスを除いて、ほとんどの文字列が正しく解析されます。以下の例は、うまくいけば何が起こっているかを示しています。

# my attempt to parse the string to 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 桁のときに発生するようです。

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

4

4 に答える 4

81

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

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

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

于 2010-11-30T18:51:47.653 に答える
65

複雑すぎるかもしれませんが、stringr パッケージが必要な理由はありますか? as.Dateとそのformat引数を使用して、文字列の入力形式を指定できます。

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

の詳細セクションに注意してください?as.Date

文字列は、指定された形式に必要な限り処理されます。末尾の文字は無視されます。

したがって、これも機能します。

as.Date(df$Date, format =  "%m/%d/%Y")
# [1] "2009-10-09" "2009-10-15"

入力を指定するために使用できるすべての変換仕様はformat、 の詳細セクションにあり?strptimeます。変換指定の順序とセパレーターが入力文字列の形式と正確に一致していることを確認してください。


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

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

あなたが与える部分的な結果から、実際のデータがどのように見えるかを推測しています。

于 2010-11-30T04:17:02.193 に答える
0

使用できる形式がわからない場合はanytime::anydate、一般的な形式に一致させようとします。

library(anytime)

date <- c("01/01/2000 0:00:00", "Jan 1, 2000 0:00:00", "2000-Jan-01 0:00:00")

anydate(date)
[1] "2000-01-01" "2000-01-01" "2000-01-01"
于 2022-02-04T18:09:21.500 に答える