2012-03-17 2 views

ответ

134

Используйте метод 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 за полный месяц, т. Е. Март «вместо» из «Мар» – PatrickT

+0

Как бы это сделать, если бы имел «вектор» из n элементов, допустим, 1k дат в одном «векторе»? – Stophface

+0

@Chrissl, как и большая часть R, 'date1' может быть также вектором дат. –

11

Вы можете использовать format:

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

Как я могу получить месяц как число? (например, 3 для Mar?) –

+1

@ user1169210 'format (x,"% m ")' – James

+0

@ user1169210 Я рассмотрел это в своем ответе. Вы хотите 'as.numeric (format (x,"% m "))' для месяца как числовое, например. –

97

lubridate package удивительно для такого рода вещи:

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

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

+1

Это был определенно лучший ответ на мои требования год из 4000 дат начала контрактов. – d8aninja

+0

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

15

Я знаю, что ОП используется zoo здесь, но я нашел эту нить погуглить для стандартного 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")) 
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) и в течение года вы хотите числовой четырехзначный год, тогда предполагая, что мы только что запустили код в вопросе:

cycle(date1) 
## [1] 3 
as.integer(date1) 
## [1] 2012 
Смежные вопросы