Извлечь месяц и год из объекта zoo :: yearmon


112

У меня есть yearmonобъект:

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

Как я могу извлечь из этого месяц и год?

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

Какую функцию я должен использовать вместо fn()

Ответы:


144

Используйте 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 для полного месяца, то есть "март" вместо "Mar"
PatrickT

Как бы я это сделал, если бы у меня было vectorn элементов, скажем, 1k дат в одном vector?
Stophface

@Chrissl, как и большая часть R, также date1может быть вектором дат.
Гэвин Симпсон

101

Пакет lubridate отлично подходит для таких вещей:

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

2
Ха, спасибо за этот ответ. Это особенно превосходит другие решения, когда вы хотите сделать что-то вроде if (year (date1)> 2014) {year (date1) <- year (date1) - 100}
Винсент

1
это определенно было лучшим ответом на мои требования по вычленению годовой части из 4000 сроков начала контрактов.
d8aninja 07

@Ari B. Friedman В настоящее время я использую R 3.1.0, хотя этот lubridateпакет не поддерживает , и попытался установить его и использовал год (дату), но он дает день вместо года, это работает только с датами в формате «2015-05 -06 "?
KRU

1
@KRU Новые версии R иногда занимают несколько недель, чтобы репозитории обновили все пакеты. Он должен работать со всеми форматами даты, если это настоящий формат даты, а не вектор символов. Отправьте новый вопрос, если это все еще не решает вашу проблему, и вы не можете искать в SO ни один из компонентов своего вопроса.
Ари Б. Фридман

15

Я знаю, что zooздесь используется OP , но я нашел этот поток в поиске стандартного tsрешения той же проблемы. Так что я подумал, что добавлю и zooбесплатный ответ для 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 марта?)
adam.888

@ user1169210 Я рассказал об этом в своем ответе. as.numeric(format(x, "%m"))Например, вы хотите, чтобы месяц был числовым.
Гэвин Симпсон

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объект, который делает ненужным пакет zoo
Марко Демайо,

0

В вопросе не указывалось, какой именно результат ожидается, но предполагалось, что для месяца вам нужен номер месяца (январь = 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.