次のようなデータセットがあります。
Month count
2009-01 12
2009-02 310
2009-03 2379
2009-04 234
2009-05 14
2009-08 1
2009-09 34
2009-10 2386
データをプロットしたい(月をx値として、カウントをy値として)。データにギャップがあるため、月の情報を日付に変換します。私は試した:
as.Date("2009-03", "%Y-%m")
しかし、うまくいきませんでした。どうしましたか? as.Date()も日を必要とし、その日の標準値を設定できないようです。どの関数が私の問題を解決しますか?
これを試して。 (ここではtext=Lines
を使用してサンプルを自己完結型に保ちますが、実際にはファイル名に置き換えます。)
Lines <- "2009-01 12
2009-02 310
2009-03 2379
2009-04 234
2009-05 14
2009-08 1
2009-09 34
2009-10 2386"
library(Zoo)
z <- read.Zoo(text = Lines, FUN = as.yearmon)
plot(z)
X軸はこのデータではあまりきれいではありませんが、実際にもっとデータがある場合は大丈夫かもしれませんし、?plot.Zoo
の例のセクションに示されている派手なX軸のコードを使用できます。
上記で作成されたZooシリーズz
は、"yearmon"
時間インデックスを持ち、次のようになります。
> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009
12 310 2379 234 14 1 34 2386
"yearmon"
も単独で使用できます。
> as.yearmon("2000-03")
[1] "Mar 2000"
注:
"yearmon"
クラスオブジェクトは、カレンダーの順序で並べ替えます。
これは、等間隔の月間ポイントをプロットします。ただし、各月の日数に比例して不等間隔でポイントをプロットする場合は、z
のインデックスを"Date"
クラスに変換します:time(z) <- as.Date(time(z))
。
日付は数値と開始日に対応するため、実際には日が必要です。データを本当に日付形式にする必要がある場合は、日付に日付を貼り付けることで、手動で各月の最初の日に修正することができます。
month <- "2009-03"
as.Date(paste(month,"-01",sep=""))
日付を日付形式にする必要がある場合の最も簡潔なソリューション:
library(Zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"
as.Date
は、毎月1日をyearmonオブジェクトに修正します。
lubridate
-パッケージのparse_date_time
またはfast_strptime
関数でもこれを実現できます。
> parse_date_time(dates1, "ym")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"
> fast_strptime(dates1, "%Y-%m")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"
これら2つの違いは、parse_date_time
は潤滑スタイル形式の仕様を許可し、fast_strptime
はstrptime
と同じ形式仕様を必要とすることです。
タイムゾーンを指定するには、tz
-パラメーターを使用できます。
> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"
日時データに不規則性がある場合、truncated
-パラメーターを使用して、許可される不規則性の数を指定できます。
> parse_date_time(dates2, "ymdHMS", truncated = 3)
[1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"
使用データ:
dates1 <- c("2009-01","2009-02","2009-03")
dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")
いつでも パッケージを使用:
library(anytime)
anydate("2009-01")
# [1] "2009-01-01"
実際、上記(およびSOの他の場所)で述べたように、文字列を日付に変換するには、特定の月の日付が必要です。 as.Date()
マニュアルページから:
日付文字列が日付を完全に指定していない場合、返される回答はシステム固有のものである可能性があります。最も一般的な動作は、欠落している年、月、または日が現在のものであると想定することです。日付が正しく指定されていない場合、信頼できる実装ではエラーが発生し、日付はNAとして報告されます。残念ながら、いくつかの一般的な実装(
glibc
など)は信頼性が低く、意図した意味を推測します。
簡単な解決策は、日付"01"
を各日付に貼り付け、strptime()
を使用してその月の最初の日であることを示すことです。
R:の処理日時についてもう少し背景を探している人向け
Rでは、時間はPOSIXct
およびPOSIXlt
クラスを使用し、日付はDate
クラスを使用します。
日付は1970年1月1日からの日数として保存され、時刻は1970年1月1日からの秒数として保存されます。
したがって、たとえば:
d <- as.Date("1971-01-01")
unclass(d) # one year after 1970-01-01
# [1] 365
pct <- Sys.time() # in POSIXct
unclass(pct) # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt) # up is now a list containing the components of time
names(up)
# [1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday" "isdst" "zone"
# [11] "gmtoff"
up$hour
# [1] 9
日付と時刻で操作を実行するには:
plt - as.POSIXlt(d)
# Time difference of 16420.61 days
日付を処理するには、strptime()
を使用できます(これらの例をマニュアルページから借用します)。
strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"
# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"
@ ben-rollertのソリューションは良いソリューションだと思います。
このソリューションを新しいパッケージ内の関数で使用する場合は、注意する必要があります。
パッケージを開発するときは、packagename::function_name()
構文を使用することをお勧めします( http://kbroman.org/pkg_primer/pages/depends.html を参照)。
この場合、Zoo
ライブラリで定義されたas.Date()
のバージョンを使用する必要があります。
以下に例を示します。
> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
setting value
version R version 3.3.1 (2016-06-21)
system x86_64, linux-gnu
ui RStudio (1.0.35)
language (EN)
collate C
tz <NA>
date 2016-11-09
Packages --------------------------------------------------------------------------------------------------------------------------------------------------------
package * version date source
devtools 1.12.0 2016-06-24 CRAN (R 3.3.1)
digest 0.6.10 2016-08-02 CRAN (R 3.2.3)
memoise 1.0.0 2016-01-29 CRAN (R 3.2.3)
withr 1.0.2 2016-06-20 CRAN (R 3.2.3)
> as.Date(Zoo::as.yearmon("1989-10", "%Y-%m"))
Error in as.Date.default(Zoo::as.yearmon("1989-10", "%Y-%m")) :
do not know how to convert 'Zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”
> Zoo::as.Date(Zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"
したがって、パッケージを開発している場合は、次を使用することをお勧めします。
Zoo::as.Date(Zoo::as.yearmon("1989-10", "%Y-%m"))