zoo :: yearmonオブジェクトから月と年を抽出する


112

私はyearmonオブジェクトを持っています:

require(zoo)
date1 <- as.yearmon("Mar 2012", "%b %Y")
class(date1)
# [1] "yearmon"

これから月と年をどのように抽出できますか?

month1 <- fn(date1)
year1 <- fn(date1)

代わりにどの機能を使用すればよいですか fn()

回答:


143

format()クラスのオブジェクトにこのメソッドを使用します"yearmon"。ここにあなたの例の日付があります(正しく作成されました!)

date1 <- as.yearmon("Mar 2012", "%b %Y")

次に、必要に応じて日付部分を抽出できます。

> format(date1, "%b") ## Month, char, abbreviated
[1] "Mar"
> format(date1, "%Y") ## Year with century
[1] "2012"
> format(date1, "%m") ## numeric month
[1] "03"

これらは文字として返されます。必要に応じて、as.numeric()年または数値の月が数値変数として必要な場合はラップしてください。たとえば、

> as.numeric(format(date1, "%m"))
[1] 3
> as.numeric(format(date1, "%Y"))
[1] 2012

詳細については?yearmon?strftimeを参照してください。後者では、使用できるプレースホルダー文字について説明しています。


4
月全体の%B、つまり「3月」の「代わり」の3月
PatrickT 14年

vector要素がn個ある場合、どうすればよいvectorですか?1つの日付に1k個の日付があるとしましょうか?
Stophface

@ChrisslはRの多くと同様に、date1日付のベクトルにすることもできます。
Gavin Simpson

101

lubridateパッケージには、この種のもののために素晴らしいです。

> require(lubridate)
> month(date1)
[1] 3
> year(date1)
[1] 2012

2
この回答ありがとうございます。if(year(date1)> 2014){year(date1)<-year(date1)-100}
Vincent

1
これは間違いなく、4000件の契約の開始日から1年の部分を削除するという私の要件に対する最良の回答でした。
d8aninja 2015年

@Ari B. Friedman私は現在R 3.1.0を使用していlubridateますが、これはパッケージをサポートしておらず、これをインストールしてyear(date)を使用しようとしましたが、年の代わりに日を表示します。これは、「2015-05」の形式の日付でのみ機能します。 -06 "?
KRU 2015年

1
@KRU新しいバージョンのRでは、リポジトリがすべてのパッケージを更新するのに数週間かかることがあります。これは、文字ベクトルではなく、真の日付形式である限り、すべての日付形式で機能するはずです。それでも問題が解決せず、質問のいずれの要素もSOで検索できない場合は、新しいqを投稿してください。
Ari B. Friedman

15

OPがzooここで使用していることはわかっていますtsが、同じ問題の標準的な解決策としてこのスレッドがグーグルであることがわかりました。なので、私もzoo-freeの答えを追加したいと思いtsました。

# create an example Date 
date_1 <- as.Date("1990-01-01")
# extract year
as.numeric(format(date_1, "%Y"))
# extract month
as.numeric(format(date_1, "%m"))

12

使用できますformat

library(zoo)
x <- as.yearmon(Sys.time())
format(x,"%b")
[1] "Mar"
format(x,"%Y")
[1] "2012"

どうすれば月を数字にできますか?(例:3月は3?)
adam.888

@ user1169210私は私の答えでこれをカバーしました。あなたは欲しいas.numeric(format(x, "%m"))例えば数値としてヶ月。
Gavin Simpson

5

大きなベクトルの場合:

y = as.POSIXlt(date1)$year + 1900    # x$year : years since 1900
m = as.POSIXlt(date1)$mon + 1        # x$mon : 0–11

1
Rはすでに便利提供するので、これは最良の答えであるPOSIXlt動物園のパッケージが不要になり、オブジェクトを
マルコDemaio

0

質問はどのような出力が期待されるかを正確に述べていませんが、月には月番号(1月= 1)が必要であり、年には数値の4桁の年が必要であると仮定して、問題のコードを実行したと仮定します。

cycle(date1)
## [1] 3
as.integer(date1)
## [1] 2012

0

1800年から現在までのデータに同様の問題があったため、これは私にとってはうまくいきました:

data2$date=as.character(data2$date) 
lct <- Sys.getlocale("LC_TIME"); 
Sys.setlocale("LC_TIME","C")
data2$date<- as.Date(data2$date, format = "%Y %m %d") # and it works
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.