2014-07-25 5 views
7

आर में, यह एक महीने के रूप में POSIXlt तिथि-समय वस्तुओं फ़ॉर्मेट करने के लिए संभव है:आर में मौसम के रूप में दिनांक-समय प्रारूप?

format(Sys.time(), format='%Y-%m') 

वहाँ मौसम, या 3 महीने समूहों (जिबूती, एमएएम, JJA, बेटे के साथ एक ही बात करने के लिए एक रास्ता है)? ये डिवीजन जलवायु और पारिस्थितिक विज्ञान में वास्तव में आम हैं, और महीनों के साथ उन्हें प्रारूपित करने के लिए एक साफ तरीका होना बहुत अच्छा होगा। स्पष्ट रूप से डीजेएफ 2 साल से अधिक समय तक गिरता है, लेकिन प्रयोजनों या इस प्रश्न के लिए, यह वास्तव में कोई फर्क नहीं पड़ता - केवल उन्हें किसी भी वर्ष में लगातार ढकता है, (या, आदर्श रूप से, यह निर्दिष्ट करने में सक्षम होना अच्छा होगा कि वे किस वर्ष में जाते हैं) ।

मैं by() के लिए आउटपुट के रूप में आउटपुट का उपयोग कर रहा हूं, इसलिए उत्पादन प्रारूप प्रत्येक वर्ष/मौसम अद्वितीय होने तक, इससे कोई फर्क नहीं पड़ता।

संपादित करें: उदाहरण डेटा:

dates <- Sys.Date()+seq(1,380, by=35) 
dates <- structure(c(16277, 16312, 16347, 16382, 16417, 16452, 16487, 
        16522, 16557, 16592, 16627), class = "Date") 
dates 
#[1] "2014-07-26" "2014-08-30" "2014-10-04" "2014-11-08" "2014-12-13" 
# "2015-01-17" "2015-02-21" "2015-03-28" "2015-05-02" "2015-06-06" "2015-07-11" 

में परिणाम चाहिए:

c("2014-JJA", "2014-JJA", "2014-SON", "2014-SON", "2015-DJF", "2015-DJF", 
    "2015-DJF", "2015-MAM", "2015-MAM", "2015-JJA", "2015-JJA") 

लेकिन "2015-DJF" रों भी "2014-DJF" हो सकता है। इसके अलावा, उत्पादन के रूप कोई प्रभाव नहीं पड़ेगा - "2104q4 या 201,404 भी ठीक होगा

+1

[यहाँ] (http://stackoverflow.com/questions/9500114/find-which-season-a-particular-date-belongs-to/9501225#9501225) एक संबंधित सवाल-जवाब। –

+2

यदि क्यू 1 डीजेएफ है, तो आदि इसे 'वर्ष "कक्षा में परिवर्तित करें, एक महीने जोड़ें और इसे' वर्ष वर्ग '' वर्ग में बदलें: 'लाइब्रेरी (चिड़ियाघर); प्रारूप (as.yearqtr (as.yearmon (Sys.time()) + 1/12)) '। यदि आप एक अलग प्रारूप चाहते हैं, तो आप प्रारूप स्ट्रिंग का उपयोग कर सकते हैं, उदा। 'प्रारूप (as.yearqtr (as.yearmon (Sys.time()) + 1/12),"% Y-% q ")' –

उत्तर

6

as.POSIXlt नाम सूची (जो यह data.frame कॉलम के लिए अनुपयुक्त बनाता है) देता है। सूची कॉलम को व्यक्तिगत रूप से एक्सेस किया जा सकता है और "वर्ष" (1 9 00-आधारित, 1 9 70 के विपरीत डिफ़ॉल्ट रूप से उपयोग किया गया) और "मोन" (0-आधारित) शामिल किया जा सकता है। hte सहायता प्रणाली में इस सूची को देखने के लिए सबसे अच्छी जगह ?DateTimeClasses है:

पहले सिर्फ एक मौसम गणना, तो एक साल के मौसम गणना

c('DJF', 'MAM', 'JJA', 'SON')[ # select from character vector with numeric vector 
      1+((as.POSIXlt(dates)$mon+1) %/% 3)%%4] 

[1] "JJA" "JJA" "SON" "SON" "DJF" "DJF" "DJF" "MAM" "MAM" "JJA" 
[11] "JJA" 



    paste(1900 + # this is the base year for POSIXlt year numbering 
      as.POSIXlt(dates)$year + 
      1*(as.POSIXlt(dates)$year==12) , # offset needed for December 
      c('DJF', 'MAM', 'JJA', 'SON')[   # indexing from 0-based-mon 
          1+((as.POSIXlt(dates)$mon+1) %/% 3)%%4] 
      , sep="-") 
[1] "2014-JJA" "2014-JJA" "2014-SON" "2014-SON" "2014-DJF" 
[6] "2015-DJF" "2015-DJF" "2015-MAM" "2015-MAM" "2015-JJA" 
[11] "2015-JJA" 

एक समारोह है कि स्वरूपण का निर्माण करने के लिए है कि मुश्किल नहीं होना चाहिए तुम आशा करते हो। यह महीने और वर्ष के लिए POSIXlt मानों पर सिर्फ मॉड्यूलो अंकगणित है।

+0

कूल, अच्छा एक। मैंने इस पर शुरुआत की, और उसके बाद आपके द्वारा पोस्ट किए गए उत्तर को हटा दिया गया, इसलिए मैंने अपना समय मध्य समय में लिखा। आपका बेहतर है कि यह अच्छे मौसम नामों का उपयोग करता है, लेकिन मुझे लगता है कि वे कार्यात्मक रूप से कम या कम समकक्ष हैं। मैं वोट तय करने दूंगा :) – naught101

+0

मुझे नहीं लगता कि मेरा बहुत स्पष्ट है। मैं मॉड्यूल डिवीजनों के साथ नॉट्स में झुका हुआ था और रहने वाले हमेशा गलत हो रहे थे। –

+0

तो मैंने ऐसा किया, क्योंकि POSIXlt में महीनों का फ्रिगिंग आंतरिक प्रतिनिधित्व 0-अनुक्रमित है, जबकि बाहरी प्रतिनिधित्व 1-अनुक्रमित है। पागल। वैसे भी, मैंने अपने साथ जाने का फैसला किया, लेकिन केवल इसलिए कि यह आपको परिणाम के रूप में परिणाम छोड़ने की अनुमति देता है, जो मेरे उद्देश्यों के लिए उपयोगी है। – naught101

4

मैं समस्याओं के इन प्रकार के लिए एक देखने वेक्टर का उपयोग कर की तरह है, जैसे:

x <- as.POSIXlt(
    seq.Date(as.Date("2000-01-01"),as.Date("2002-01-01"),by="2 months") 
) 

जैसे, यदि आप। दक्षिणी गोलार्द्ध मौसम निर्दिष्ट करना चाहते हैं, तो आप कर सकता है:

src <- rep(c("su","au","wi","sp"),each=3)[c(2:12,1)] 

paste(format(x,"%Y-%m"),src[x$mon+1]) 
# [1] "2000-01 su" "2000-03 au" "2000-05 au" "2000-07 wi" "2000-09 sp" 
# [6] "2000-11 sp" "2001-01 su" "2001-03 au" "2001-05 au" "2001-07 wi" 
#[11] "2001-09 sp" "2001-11 sp" "2002-01 su" 

बदलें src नामों के रूप में आप श्रेणियों relabel को मनचाहे ढंग

2

Let Q1 DJF हो; Q2, एमएएम, आदि तो।:

seasonal.quarters <- function(x) { 
    x <- as.POSIXlt(x) 
    x$mon <- (x$mon + 1) %% 12 
    quarters(x) 
} 

options(stringsAsFactors=FALSE) 

nonleap.year <- seq(from=as.POSIXct('2013-1-1'), to=as.POSIXct('2014-1-1'), by='day') 
d <- data.frame(ms=months(nonleap.year), qs=seasonal.quarters(nonleap.year)) 
by(d, INDICES=list(d$qs), FUN=function(x) unique(x$ms)) 
# : Q1 
# [1] "January" "February" "December" 
# ------------------------------------- 
# : Q2 
# [1] "March" "April" "May" 
# ------------------------------------- 
# : Q3 
# [1] "June" "July" "August" 
# ------------------------------------- 
# : Q4 
# [1] "September" "October" "November" 

leap.year <- seq(from=as.POSIXct('2016-1-1'), to=as.POSIXct('2017-1-1'), by='day') 
d <- data.frame(ms=months(leap.year), qs=seasonal.quarters(leap.year)) 
by(d, INDICES=list(d$qs), FUN=function(x) unique(x$ms)) 
# : Q1 
# [1] "January" "February" "December" 
# ------------------------------------- 
# : Q2 
# [1] "March" "April" "May" 
# ------------------------------------- 
# : Q3 
# [1] "June" "July" "August" 
# ------------------------------------- 
# : Q4 
# [1] "September" "October" "November" 
+0

भिन्नता मूल रूप से दिसंबर में जनवरी में बदल जाती है, है ना? लेकिन यह सटीक रूप से काम नहीं करेगा, क्योंकि प्रत्येक तिमाही एक अलग लंबाई है, और पहली तिमाही लीप-सालों में एक अलग लंबाई है। – naught101

+0

हाँ, मुझे बस एहसास हुआ। यह विश्वसनीय नहीं है। जल्द ही हटा देंगे। –

+0

@ naught101, अपडेट किया गया। –

2

यह ऊपर 42-'s answer का विकल्प है। मैंने इसे पोस्ट करने के कारण वहां मेरी टिप्पणी देखें।

dates_orig <- as.POSIXlt(c("2013-01-01", "2013-02-01", "2013-03-01", "2013-04-01", "2013-05-01", "2013-06-01", "2013-07-01", "2013-08-01", "2013-09-01", "2013-10-01", "2013-11-01", "2013-12-01", "2014-01-01", "2014-02-01", "2014-03-01", "2014-04-01", "2014-05-01", "2014-06-01", "2014-07-01", "2014-08-01", "2014-09-01", "2014-10-01", "2014-11-01", "2014-12-01")) 

format(dates_orig, format='%Y%b') 
[1] "2013Jan" "2013Feb" "2013Mar" "2013Apr" "2013May" "2013Jun" "2013Jul" "2013Aug" "2013Sep" "2013Oct" "2013Nov" "2013Dec" "2014Jan" "2014Feb" "2014Mar" 
[16] "2014Apr" "2014May" "2014Jun" "2014Jul" "2014Aug" "2014Sep" "2014Oct" "2014Nov" "2014Dec" 

dates <- as.POSIXlt(dates_orig) 
# shift Jan and Feb to the previous year 
dates$year[dates$mon < 2] <- dates$year[dates$mon < 2] - 1 
# convert months to seasons (named by first month of season) 
dates$mon <- (((dates$mon - 2) %/% 3) %% 4) * 3 + 2 

format(dates, format='%Y%b') 
[1] "2012Dec" "2012Dec" "2013Mar" "2013Mar" "2013Mar" "2013Jun" "2013Jun" "2013Jun" "2013Sep" "2013Sep" "2013Sep" "2013Dec" "2013Dec" "2013Dec" "2014Mar" 
[16] "2014Mar" "2014Mar" "2014Jun" "2014Jun" "2014Jun" "2014Sep" "2014Sep" "2014Sep" "2014Dec" 
+1

यह मूल में विनाशकारी संशोधन का उपयोग करता है और फिर यह वास्तव में प्रश्न का उत्तर नहीं देता है क्योंकि आपको अभी भी महीने मिल रहे हैं। –

+0

@ 42-: इसके परिणामस्वरूप मौसम के पहले महीने में परिणाम होता है - यदि आवश्यक हो तो "डीजेएफ", "एमएमए" आदि के लिए महीनों को स्ट्रिंग करना मुश्किल नहीं है। यह मेरे लिए नहीं था। डेटा हानि के रूप में, मौसम को मौसम में कनवर्ट करना हमेशा * हानिकारक होने वाला होता है। यदि आप परवाह करते हैं, तो मूल डेटा को न छोड़ें। आपका समाधान उतना ही हानिकारक है। – naught101

+0

मुझे लगता है कि टिप्पणियों पर लोगों को इंगित करने के बजाय आपको जवाब में उस स्पष्टीकरण को संपादित करना चाहिए, मुझे लगता है। – Frank

संबंधित मुद्दे