एक चिड़ियाघर से साल और साल निकालें :: yearmon object


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 पूरे महीने के लिए, अर्थात "मार्च" के बजाय "मार्च"
पैट्रिकटी

मैं कैसे करूँगा कि यदि vectorn तत्वों में से एक है, तो 1k तिथियों को एक में बताएं vector?
स्टोफ़फेस डिक्

@ आर की तरह बहुत अधिक, date1तारीखों का एक वेक्टर भी हो सकता है।
गैविन सिम्पसन 13

101

Lubridate पैकेज की बात इस तरह के अद्भुत है:

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

2
हा इस उत्तर के लिए धन्यवाद। जब आप कुछ करना चाहते हैं तो यह विशेष रूप से अन्य समाधानों को धड़कता है, जैसे कि यदि आप (वर्ष (तारीख 1)> 2014) {वर्ष (तारीख 1) <- वर्ष (तारीख 1) - 100}
विन्सेन्ट

1
यह निश्चित रूप से 4000 अनुबंधों की शुरुआत की तारीखों में से साल का टुकड़ा लेने की मेरी आवश्यकताओं के लिए सबसे अच्छा जवाब था।
d8aninja

@ अरी बी। फ्रीडमैन मैं वर्तमान में आर 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
यह सबसे अच्छा उत्तर है, क्योंकि आर पहले से ही आसान POSIXltवस्तु प्रदान करता है जो चिड़ियाघर पैकेज को अनावश्यक बनाता है
मार्को डेमायो

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.