2012-03-17 18 views

Odpowiedz

134

Użyj metody format() dla obiektów klasy "yearmon". Oto przykład data (prawidłowo utworzony!)

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

Wtedy możemy wyodrębnić części date wymagane:

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

Są one zwracane jako bohaterów. W razie potrzeby zawiń as.numeric(), jeśli chcesz, aby rok lub miesiąc numeryczny był zmienną numeryczną, np.

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

Zobacz ?yearmon i ?strftime do szczegółów - wyjaśnia ostatnie znaki zastępcze można użyć.

+4

% B na cały miesiąc, tj. Marca "zamiast" z "Mar" – PatrickT

+0

Jak to zrobić, jeśli miał "wektor" z n elementów, powiedzmy 1k daty w jednym 'wektora'? – Stophface

+0

@Chrissl podobnie jak wiele z R, 'date1' może być również wektorem dat. –

11

Można użyć format:

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

Jak mogę uzyskać miesiąc jako numer? (np. 3 dla Mar?) –

+1

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

+0

@ user1169210 Podałem to w mojej odpowiedzi. Chcesz na przykład "as.numeric (format (x,"% m "))" na miesiąc jako numeryczny. –

97

lubridate package jest niesamowite dla tego rodzaju rzeczy:

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

Ha dziękuję za tę odpowiedź. Szczególnie bije inne rozwiązania, gdy chcesz zrobić coś takiego, jak , jeśli (rok (data1)> 2014) {rok (data1) <- rok (data1) - 100} – Vincent

+1

to była zdecydowanie najlepsza odpowiedź na moje wymagania dotyczące rok z ponad 4000 dat rozpoczęcia kontraktów. – d8aninja

+0

@Ari B. Friedman Obecnie używam R 3.1.0, gdy ten pakiet 'lubridate' nie działa i próbuję zainstalować ten i użyty rok (data), ale daje on dzień zamiast roku, to działa tylko na datach, których format jest "2015-05-06"? – KRU

15

wiem, że PO jest za pomocą zoo tutaj, ale znalazłem ten wątek googling dla standardowego ts rozwiązanie dla tego samego problemu. Pomyślałem więc, że dodam też bezpłatną odpowiedź zoo dla 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

Dla dużych wektorów:

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

To jest najlepsza odpowiedź, ponieważ R już udostępnia poręczny obiekt "POSIXlt", który sprawia, że ​​pakiet z zoo jest niepotrzebny –

0

Pytanie nie określiła dokładnie, co wyjście jest oczekiwano, ale przy założeniu, że za miesiąc chcesz numer miesiąca (styczeń = 1) i za rok chcesz numeryczny 4-cyfrowy rok, zakładając, że właśnie uruchomiliśmy kod w pytaniu:

cycle(date1) 
## [1] 3 
as.integer(date1) 
## [1] 2012 
Powiązane problemy