Wyodrębnij miesiąc i rok z obiektu zoo :: yearmon


112

Mam yearmonobiekt:

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

Jak mogę z tego wyodrębnić miesiąc i rok?

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

Jakiej funkcji powinienem użyć zamiast fn()

Odpowiedzi:


144

Użyj format()metody dla obiektów klasy "yearmon". Oto Twoja przykładowa data (poprawnie utworzona!)

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

Następnie możemy wyodrębnić części daty zgodnie z wymaganiami:

> 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 znaki. W razie potrzeby zawiń, as.numeric()jeśli chcesz, aby rok lub miesiąc był zmienną numeryczną, np

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

Zobacz ?yearmoni ?strftimepo szczegóły - ta ostatnia wyjaśnia znaki zastępcze, których możesz użyć.


4
% B dla całego miesiąca, tj. Marzec „zamiast” „marca”
PatrickT

Jak bym to zrobił, gdyby miał vectorn elementów, powiedzmy 1k dat w jednym vector?
Stophface

@Chrissl, podobnie jak większość R, date1może być również wektorem dat.
Gavin Simpson

101

Pakiet lubridate jest niesamowite dla tego rodzaju rzeczy:

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

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

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

@Ari B. Friedman Obecnie używam R 3.1.0, chociaż ten lubridatepakiet nie obsługuje i próbowałem zainstalować ten i używany rok (datę), ale podaje dzień zamiast roku, działa to tylko w przypadku dat, których format to „2015-05 -06 "?
KRU

1
@KRU Nowe wersje R czasami potrzebują kilku tygodni, zanim repozytoria zaktualizują wszystkie pakiety. Powinien działać na wszystkich formatach daty, o ile jest to prawdziwy format daty, a nie wektor znaków. Napisz nowy q, jeśli to nadal nie rozwiąże twojego problemu i nie możesz wyszukać SO dla żadnego z komponentów twojego pytania.
Ari B. Friedman

15

Wiem, że OP używa zootutaj, ale znalazłem ten wątek googlujący w celu tsznalezienia standardowego rozwiązania tego samego problemu. Pomyślałem więc, że dodam również zooodpowiedź bezpłatną 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

Możesz użyć format:

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

Jak sprawić, by miesiąc był liczbą? (np. 3 dla marca?)
adam.888

@ user1169210 Omówiłem to w mojej odpowiedzi. Na przykład chcesz, as.numeric(format(x, "%m"))aby miesiąc był liczbą.
Gavin Simpson,

5

W przypadku 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
Jest to najlepsze rozwiązanie, ponieważ R już zapewnia poręczny POSIXltprzedmiot sprawia, że pakiet zoo niepotrzebny
Marco DeMaio

0

Pytanie nie określało dokładnie, jakiego wyniku oczekuje się, ale zakładając, że dla miesiąca chcesz numer miesiąca (styczeń = 1), a dla roku 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

0

Mając podobny problem z danymi od 1800 do teraz, zadziałało to dla mnie:

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.