年と月(「yyyy-mm」形式)を日付に変換しますか?


91

次のようなデータセットがあります。

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()も1日を必要とし、その日の標準値を設定できないようです。問題を解決するのはどの機能ですか?

回答:


57

これを試して。(ここでは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軸はそれほどきれいではありませんが、実際にデータが多い場合は問題ないか、の例のセクションに示す豪華なX軸のコードを使用できます?plot.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"

注意:

  1. "yearmon" クラスオブジェクトはカレンダー順にソートされます。

  2. これにより、毎月のポイントが等間隔でプロットされます。ただし、各月の日数に比例して不等間隔にポイントをプロットする必要がある場合は、のインデックスz"Date"クラスに 変換しますtime(z) <- as.Date(time(z))


76

日付は数値と開始日に対応しているため、実際には日が必要です。データを日付形式にする必要がある場合は、日付に日付を貼り付けることで、手動で日を毎月の最初に修正できます。

month <- "2009-03"
as.Date(paste(month,"-01",sep=""))

日付には他にどのような形式がありますか?POSIXとISOで何かを見ましたが、それらが異なる形式であるかどうかはわかりません。これらは単なる関数だと思いました...
R_User

19
フォーマッターで同じ日を指定できるのでas.Date(month, format='%Y-%m-01')、同じ結果を得ることができます。毎月同じ日付を指定することは、日付の形式よりも文字列操作の方が多いので、これは「好ましい」と感じますが、おそらくそれはナンセンスです。
JBecker 2013年

21
@JBeckerあなたの提案は私にはうまくいきません。> as.Date("2016-01", format="%Y-%m-01") # [1] NA。私はR 3.3.1を使用しています
n8sty 2017年

26

日付を日付形式にする必要がある場合の最も簡潔なソリューション:

library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"

as.Date 毎月1日をyearmonオブジェクトに修正します。


23

-packageのparse_date_timeor fast_strptime関数でこれを実現することもできますlubridate

> 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-parameter を使用できます。

> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

日時データにtruncated不規則性がある場合、-parameterを使用して、許容される不規則性の数を指定できます。

> 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")

を使用して文字変数をフォーマットに変換dateしたparse_date_time後、パッケージ"2009-01-01 UTC"を使用するのとは異なる順序でそれを表示する方法はありlubridateますか?私のデータセットで最初にその日を見たいと思い01-01-2009ます。
user63230

1
@ user63230を参照してください?format。例:format(your_date, "%d-%m-%Y")。ただし、これには欠点があります。日付ではなく文字値が返されます。
Jaap

おかげで、私はformatあなたが言及する理由のために避けようとしていました、私はこれをlubridateパッケージに組み込む方法があるかもしれないと思いましたが、そうではないようです。
user63230

12

いつでもパッケージを使用:

library(anytime)

anydate("2009-01")
# [1] "2009-01-01"

それが「01-01」を選択するのは少し奇妙です、その選択についてのドキュメントに何かありますか?anydate("2009-03")それが常に月の最初の日を選択するかどうかを示すために、おそらくもっと説明的です。
lmo 2017

@lmoはドキュメントをチェックしませんでした。ddが1日目を選択できない場合、これは「一般的な」慣行だと思います。
zx8754 2017

2
それは理にかなっている。私は漠然と覚えていて、コメントのきっかけを見つけました。注のセクションから?strptime入力文字列は日付を完全に指定する必要はありません。指定されていない秒、分、または時間はゼロであり、指定されていない年、月、または日が現在のものであると想定されます。(ただし、月が指定されている場合、当月の現在の日は指定された月に対して有効である必要がないため、その月の日は%dまたは%eで指定する必要があります。)メガトロンの回答に同様の部分が含まれているようですからのドキュメントのas.Date
lmo 2017

1900年より前の年は機能しません。たとえば、私はこれを試しましたanytime('1870-01')
msh855

5

実際、上記(および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"

1

@ ben-rollertのソリューションは良いソリューションだと思います。

このソリューションを新しいパッケージ内の関数で使用する場合は注意が必要です。

パッケージを開発するときは、構文を使用することをお勧めしますpackagename::function_name()http://kbroman.org/pkg_primer/pages/depends.htmlを参照)。

この場合、ライブラリでas.Date()定義されているバージョンのを使用する必要がありzooます。

次に例を示します。

> 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"))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.