Bir hayvanat bahçesinden ayı ve yılı ayıklayın :: yearmon nesnesinden


112

Bir yearmonnesnem var:

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

Bundan ayı ve yılı nasıl çıkarabilirim?

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

Yerine hangi işlevi kullanmalıyım fn()

Yanıtlar:


144

format()Sınıfın nesneleri için yöntemi kullanın "yearmon". İşte örnek tarihiniz (uygun şekilde oluşturulmuş!)

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

Ardından tarih bölümlerini gerektiği gibi çıkarabiliriz:

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

Bunlar karakter olarak döndürülür. Uygun olduğu as.numeric()durumlarda, yılı veya sayısal ayı sayısal değişken olarak istiyorsanız , sarın , ör.

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

Bkz ?yearmonve ?strftimedetaylar için - ikincisi kullanabilirsiniz tutucu karakterleri açıklar.


4
Tam ay için% B, yani "Mart" yerine "Mart
PatrickT

vectorN tane öğeye sahip olsaydım bunu nasıl yaparım, diyelim ki 1k tarih bir arada vector?
Stophface

@Chrissl, R'nin çoğu gibi date1, tarihlerin bir vektörü de olabilir.
Gavin Simpson

101

Lubridate paketi bu tür bir şey için şaşırtıcı:

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

2
Bu cevap için teşekkür ederim. İf (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
bu, 4000 sözleşmenin başlangıç ​​tarihlerinden yılın parçasını alma gereksinimlerime kesinlikle en iyi cevaptı.
d8aninja

@Ari B. Friedman Şu anda R 3.1.0 kullanıyorum, bu lubridatepaketi desteklemiyor ve bunu yüklemeyi denedim ve yılı (tarih) kullanıyorum, ancak yıl yerine gün veriyor bu yalnızca biçimi "2015-05 olan tarihlerde çalışıyor -06 "mı?
KRU

1
@KRU R'nin yeni sürümleri, depoların tüm paketleri güncellemesi bazen birkaç hafta sürebilir. Bir karakter vektörü değil, gerçek bir tarih formatı olduğu sürece tüm tarih formatlarında çalışmalıdır. Sorununuzu hala çözmüyorsa ve sorunuzun her iki bileşeni için de SO'da arama yapamıyorsanız lütfen yeni bir q gönderin.
Ari B. Friedman

15

OP'nin zooburada kullandığını biliyorum , ancak bu konuyu tsaynı sorun için standart bir çözüm için googling buldum . Ben de zoo-free cevabı ekleyeceğimi düşündüm 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

Şunları kullanabilirsiniz format:

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

Ayın bir sayı olmasını nasıl sağlayabilirim? (örn Mar için 3?)
adam.888

@ user1169210 Bunu cevabımda ele aldım. as.numeric(format(x, "%m"))Ayı örneğin sayısal olarak istiyorsunuz .
Gavin Simpson

5

Büyük vektörler için:

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

1
Bu en iyi cevap, çünkü R POSIXlthayvanat bahçesi paketini gereksiz kılan kullanışlı nesneyi zaten sağlıyor
Marco Demaio

0

Soru, tam olarak hangi çıktının beklendiğini belirtmiyordu, ancak ay için ay numarasını (Ocak = 1) istediğinizi ve yıl için sayısal 4 basamaklı yılı istediğinizi ve ardından sorudaki kodu sadece çalıştırdığımızı varsayarak:

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

0

1800'den bugüne kadar benzer bir problem yaşadığım için bu benim için çalıştı:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.