Trích xuất tháng và năm từ đối tượng sở thú :: yearmon


112

Tôi có một yearmonđối tượng:

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

Làm thế nào tôi có thể trích xuất tháng và năm từ điều này?

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

Tôi nên sử dụng chức năng nào thay cho fn()

Câu trả lời:


143

Sử dụng format()phương thức cho các đối tượng của lớp "yearmon". Đây là ngày mẫu của bạn (được tạo đúng cách!)

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

Sau đó, chúng tôi có thể trích xuất các phần ngày theo yêu cầu:

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

Chúng được trả về dưới dạng ký tự. Nếu thích hợp, hãy kết thúc as.numeric()nếu bạn muốn năm hoặc tháng số dưới dạng biến số, ví dụ:

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

Xem ?yearmon?strftimeđể biết chi tiết - phần sau giải thích các ký tự giữ chỗ bạn có thể sử dụng.


4
% B cho cả tháng, tức là tháng 3 "thay vì" tháng 3 "
PatrickT

Làm thế nào tôi sẽ làm điều đó nếu có một vectortrong n phần tử, giả sử 1k ngày trong một vector?
Stophface

@Chrissl giống như nhiều R, date1cũng có thể là một vectơ ngày tháng.
Gavin Simpson

101

Các gói lubridate là tuyệt vời cho các loại hình điều:

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

2
Hà cảm ơn bạn vì câu trả lời này. Nó đặc biệt đánh bại các giải pháp khác khi bạn muốn làm điều gì đó như if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Vincent

1
đây chắc chắn là câu trả lời tốt nhất cho yêu cầu của tôi về việc lấy mảnh năm trong số 4000 ngày bắt đầu của hợp đồng.
d8aninja

@Ari B. Friedman Tôi hiện đang sử dụng R 3.1.0 trong khi lubridategói này không hỗ trợ và đã thử cài đặt này và đã sử dụng năm (ngày) nhưng nó cung cấp ngày thay vì năm, điều này chỉ hoạt động trên các ngày có định dạng là "2015-05 -06 ”?
KRU

1
@KRU Các phiên bản mới của R đôi khi mất vài tuần để kho lưu trữ cập nhật tất cả các gói. Nó sẽ hoạt động trên tất cả các định dạng ngày miễn là định dạng ngày tháng thực sự, không phải là một vectơ ký tự. Vui lòng đăng một q mới nếu điều đó vẫn không giải quyết được vấn đề của bạn và bạn không thể tìm kiếm SO cho bất kỳ thành phần nào trong câu hỏi của mình.
Ari B. Friedman,

15

Tôi biết OP đang sử dụng zooở đây, nhưng tôi đã tìm thấy googling luồng này cho một tsgiải pháp tiêu chuẩn cho cùng một vấn đề. Vì vậy, tôi nghĩ rằng tôi cũng sẽ thêm một zoocâu trả lời miễn phí 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

Bạn có thể sử dụng format:

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

Làm thế nào tôi có thể lấy tháng thành một số? (ví dụ: 3 cho tháng 3?)
adam.888

@ user1169210 Tôi đã đề cập vấn đề này trong câu trả lời của mình. as.numeric(format(x, "%m"))Ví dụ, bạn muốn tháng ở dạng số.
Gavin Simpson

5

Đối với vectơ lớn:

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

1
Đây là câu trả lời tốt nhất, vì R đã cung cấp tiện dụng POSIXltđối tượng đó làm cho gói vườn thú không cần thiết
Marco Demaio

0

Câu hỏi không nêu chính xác sản lượng dự kiến ​​là bao nhiêu nhưng giả sử rằng tháng bạn muốn số tháng (tháng 1 = 1) và cho năm bạn muốn năm 4 chữ số thì giả sử rằng chúng ta vừa chạy mã trong câu hỏi:

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

0

Gặp sự cố tương tự với dữ liệu từ năm 1800 đến nay, điều này đã làm việc với tôi:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.