Витяг місяця та року з об’єкта зоопарку :: рік


112

У мене є yearmonоб'єкт:

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

Як я можу отримати з цього місяць і рік?

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

Яку функцію слід використовувати замість fn()

Відповіді:


143

Використовуйте 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

Як би я це зробив, якби мав vectorз n елементів, скажемо дати 1k в одному vector?
Stophface

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

101

Пакет змащення дивовижний для подібних речей:

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

2
Ха дякую за цю відповідь. Особливо він перемагає інші рішення, коли хочеш зробити щось на кшталт if (рік (дата1)> 2014) {рік (дата1) <- рік (дата1) - 100}
Вінсент

1
це, безумовно, була найкращою відповіддю на мої вимоги щодо виведення деталі року з 4000 дати початку контрактів.
d8aninja

@Ari B. Friedman Я зараз використовую R 3.1.0, хоча це не підтримує lubridateпакет і намагався встановити цей і використаний рік (дата), але він дає день, а не рік, це працює лише у дати, формат яких "2015-05 -06 "?
КРУ

1
@KRU Нові версії R іноді потребують декількох тижнів, щоб сховища оновлювали всі пакети. Він повинен працювати на всіх форматах дат, якщо це справжній формат дати, а не векторний символ. Будь ласка, опублікуйте новий q, якщо це все ще не вирішує вашу проблему, і ви не можете шукати SO для будь-якого компонента вашого питання.
Арі Б. Фрідман

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"))

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об’єкт, який робить пакет із зоопарком непотрібним
Марко Демайо

0

У запитанні не було чітко зазначено, який результат очікується, але припускаючи, що для місяця ви хочете число місяця (січень = 1), а за рік ви хочете числовий чотиризначний рік, то припускаючи, що ми щойно запустили код у питанні:

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.