Ekstrak bulan dan tahun dari objek kebun binatang :: yearmon


112

Saya punya yearmonobjek:

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

Bagaimana cara mengekstrak bulan dan tahun dari sini?

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

Fungsi apa yang harus saya gunakan sebagai pengganti fn()

Jawaban:


143

Gunakan format()metode untuk objek kelas "yearmon". Ini contoh tanggal Anda (dibuat dengan benar!)

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

Kemudian kita dapat mengekstrak bagian tanggal sesuai kebutuhan:

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

Ini dikembalikan sebagai karakter. Jika sesuai, masukkan as.numeric()jika Anda ingin tahun atau bulan numerik sebagai variabel numerik, misalnya

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

Lihat ?yearmondan ?strftimeuntuk detailnya - yang terakhir menjelaskan karakter placeholder yang dapat Anda gunakan.


4
% B untuk satu bulan penuh, yaitu Maret "bukan" dari "Mar"
PatrickT

Bagaimana saya melakukannya jika memiliki satu vectordari n elemen, katakanlah 1k tanggal dalam satu vector?
Stophface

@Chrissl seperti kebanyakan R, juga date1bisa menjadi vektor tanggal.
Gavin Simpson

101

The paket lubridate menakjubkan untuk hal semacam ini:

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

2
Ha terima kasih atas jawaban ini. Ini terutama mengalahkan solusi lain ketika Anda ingin melakukan sesuatu seperti if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
ini jelas merupakan jawaban terbaik untuk kebutuhan saya mengambil bagian tahun dari tanggal mulai 4000 kontrak.
d8aninja

@Ari B. Friedman saya saat ini menggunakan R 3.1.0 sementara ini tidak mendukung lubridatepaket dan mencoba menginstal ini dan tahun yang digunakan (tanggal) tetapi memberikan hari dan bukan tahun apakah ini hanya berfungsi pada tanggal yang formatnya adalah "2015-05 -06 "?
KRU

1
@KRU Versi baru R terkadang membutuhkan waktu beberapa minggu untuk repositori memperbarui semua paket. Ini harus bekerja pada semua format tanggal selama itu adalah format tanggal yang sebenarnya, bukan vektor karakter. Silakan posting q baru jika itu masih tidak menyelesaikan masalah Anda dan Anda tidak dapat mencari SO untuk salah satu komponen pertanyaan Anda.
Ari B. Friedman

15

Saya tahu OP digunakan di zoosini, tetapi saya menemukan utas ini mencari tssolusi standar untuk masalah yang sama di Google. Jadi saya pikir saya akan menambahkan zoojawaban -gratis tsjuga.

# 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

Anda dapat menggunakan format:

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

Bagaimana caranya agar bulan menjadi angka? (mis. 3 untuk Mar?)
adam. 888

@ user1169210 Saya membahas ini dalam jawaban saya. Anda menginginkan as.numeric(format(x, "%m"))bulan sebagai angka misalnya.
Gavin Simpson

5

Untuk vektor besar:

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

1
Ini adalah jawaban terbaik, karena R sudah menyediakan POSIXltobjek praktis yang membuat paket kebun binatang tidak diperlukan
Marco Demaio

0

Pertanyaan tidak menyatakan dengan tepat keluaran apa yang diharapkan tetapi dengan asumsi bahwa untuk bulan Anda menginginkan nomor bulan (Januari = 1) dan untuk tahun Anda menginginkan tahun numerik 4 digit, maka asumsikan bahwa kami baru saja menjalankan kode di pertanyaan:

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

0

Memiliki masalah serupa dengan data dari 1800 hingga sekarang, ini berhasil untuk saya:

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.