वर्ष और महीने ("yyyy-mm" प्रारूप) को दिनांक में परिवर्तित करना?


91

मेरे पास एक डेटासेट है जो इस तरह दिखता है:

Month    count
2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386

मैं डेटा प्लॉट करना चाहता हूं (x मान के रूप में महीने और y मान के रूप में मायने रखता है)। चूंकि डेटा में अंतराल हैं, इसलिए मैं माह के लिए सूचना को दिनांक में बदलना चाहता हूं। मैंने कोशिश की:

as.Date("2009-03", "%Y-%m")

लेकिन यह काम नहीं आया। क्या गलत है? ऐसा लगता है कि as.Date () को भी एक दिन की आवश्यकता होती है और दिन के लिए एक मानक मान सेट करने में सक्षम नहीं है? कौन सा फ़ंक्शन मेरी समस्या का हल करता है?

जवाबों:


57

इसे इस्तेमाल करे। (यहां हम text=Linesउदाहरण को स्व-निहित रखने के लिए उपयोग करते हैं लेकिन वास्तव में हम इसे फ़ाइल नाम के साथ बदल देंगे।)

Lines <- "2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386"

library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)

इस डेटा के साथ एक्स अक्ष इतना सुंदर नहीं है लेकिन अगर आपके पास वास्तविकता में अधिक डेटा है तो यह ठीक हो सकता है या आप उदाहरण के अनुभाग में दिखाए गए फैंसी एक्स अक्ष के लिए कोड का उपयोग कर सकते हैं ?plot.zoo

चिड़ियाघर श्रृंखला, zजो ऊपर बनाई गई है, में एक "yearmon"समय सूचकांक है और यह इस तरह दिखता है:

> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 
      12      310     2379      234       14        1       34     2386 

"yearmon" अकेले भी इस्तेमाल किया जा सकता है:

> as.yearmon("2000-03")
[1] "Mar 2000"

ध्यान दें:

  1. "yearmon" क्लास ऑब्जेक्ट कैलेंडर क्रम में सॉर्ट करते हैं।

  2. यह समान रूप से अंतराल अंतराल पर मासिक बिंदुओं की साजिश करेगा, जो कि संभावना है कि क्या चाहता है; हालांकि, अगर यह प्रत्येक महीने में दिनों की संख्या के अनुपात में स्थान दिया गया है असमान स्थान के अंतराल पर अंक साजिश वांछित थे तब के सूचकांक में परिवर्तित zकरने के लिए "Date"वर्ग: time(z) <- as.Date(time(z))


76

चूंकि तिथियां एक संख्यात्मक मान और प्रारंभिक तिथि के अनुरूप होती हैं, इसलिए आपको वास्तव में दिन की आवश्यकता होती है। यदि आपको वास्तव में दिनांक प्रारूप में अपने डेटा की आवश्यकता है, तो आप इसे तिथि पर चिपकाकर मैन्युअल रूप से प्रत्येक महीने के पहले दिन को ठीक कर सकते हैं:

month <- "2009-03"
as.Date(paste(month,"-01",sep=""))

तारीखों के अन्य प्रारूप क्या हैं? मैंने POSIX के साथ कुछ और आईएसओ के साथ कुछ देखा, लेकिन मुझे यकीन नहीं है कि अगर वे अलग-अलग प्रारूप हैं। मुझे लगा कि ये केवल कार्य हैं, ...
R_User

19
वर्थ नोटिंग कि आप फॉर्मेटर में एक ही दिन होने के रूप में निर्दिष्ट कर सकते हैं, इसलिए आप as.Date(month, format='%Y-%m-01')एक ही परिणाम प्राप्त कर सकते हैं और प्राप्त कर सकते हैं । यह "महसूस" मेरे लिए बेहतर है क्योंकि प्रत्येक महीने में एक ही तारीख निर्दिष्ट करने की तारीख के प्रारूप के बारे में अधिक है फिर स्ट्रिंग हेरफेर, लेकिन शायद यह बकवास है।
जेबेकर

21
@JBecker आपका सुझाव मेरे लिए काम नहीं करता है। > as.Date("2016-01", format="%Y-%m-01") # [1] NA। मैं
20:33 पर

26

यदि आपको दिनांक प्रारूप में दिनांक की आवश्यकता है तो सबसे संक्षिप्त समाधान:

library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"

as.Date आपके लिए प्रत्येक माह के पहले दिन को एक वर्ष की अवधि के लिए ठीक करेगा।


23

आप इसे- पैकेज से parse_date_timeया fast_strptimeफ़ंक्शंस से भी प्राप्त कर सकते हैं lubridate:

> parse_date_time(dates1, "ym")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

> fast_strptime(dates1, "%Y-%m")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

उन दोनों के बीच अंतर यह है कि parse_date_timeलुब्रिडेट-शैली प्रारूप विनिर्देश के लिए अनुमति देता है, जबकि fast_strptimeउसी प्रारूप विनिर्देश की आवश्यकता होती है strptime

tzटाइमज़ोन निर्दिष्ट करने के लिए, आप -parameter का उपयोग कर सकते हैं :

> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

जब आपके दिनांक-समय के डेटा में अनियमितता होती है, तो आप यह truncatedनिर्दिष्ट करने के लिए -parameter का उपयोग कर सकते हैं कि कितनी अनियमितताओं की अनुमति है:

> parse_date_time(dates2, "ymdHMS", truncated = 3)
[1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"

प्रयुक्त डेटा:

dates1 <- c("2009-01","2009-02","2009-03")
dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")

एक चरित्र चर स्वरूप में परिवर्तित होने dateका उपयोग कर parse_date_time, वहाँ से एक अलग क्रम में इसे देखने के लिए एक तरीका है "2009-01-01 UTC"का उपयोग कर lubridateपैकेज? मैं अपने डेटासेट में पहले दिन जैसे देखना पसंद करूंगा 01-01-2009
उपयोगकर्ता 63230

1
@ user63230 देखें ?format; उदाहरण के लिए: format(your_date, "%d-%m-%Y")। हालांकि इसके लिए एक नुकसान है: आप एक चरित्र मूल्य वापस पाने के लिए और तारीख नहीं।
जाप

धन्यवाद, लेकिन मैं formatआपके द्वारा बताए गए कारण से बचने की कोशिश कर रहा था , मैंने सोचा कि lubridateपैकेज में इसे शामिल करने का एक तरीका हो सकता है लेकिन ऐसा नहीं है।
user63230

12

किसी भी पैकेज का उपयोग करना :

library(anytime)

anydate("2009-01")
# [1] "2009-01-01"

यह थोड़ा अजीब है कि यह "01-01" चुनता है, क्या पसंद के बारे में प्रलेखन में कुछ है? शायद यह दिखाने के लिए और अधिक आकर्षक है कि anydate("2009-03")क्या यह हमेशा महीने का पहला दिन चुनता है।
lmo

@lmo ने डॉक्स की जांच नहीं की, मैं कहता हूं कि यह "सामान्य" अभ्यास है जब dd 1 दिन चुनने के लिए गायब है।
zx8754

2
यह समझ आता है। मुझे अस्पष्ट रूप से याद किया गया और फिर पाया कि टिप्पणी से क्या शुरू हुआ। के नोट अनुभाग से ?strptime: इनपुट स्ट्रिंग को पूरी तरह से तारीख निर्दिष्ट करने की आवश्यकता नहीं है: यह माना जाता है कि अनिर्दिष्ट सेकंड, मिनट या घंटे शून्य हैं, और एक अनिर्दिष्ट वर्ष, महीना या दिन वर्तमान है। (हालांकि, यदि एक महीने को निर्दिष्ट किया जाता है, तो उस महीने का दिन% d या% e द्वारा निर्दिष्ट किया जाना चाहिए क्योंकि महीने के वर्तमान दिन को निर्दिष्ट महीने के लिए मान्य नहीं होना चाहिए।) ऐसा लगता है कि मेगाट्रॉन के उत्तर में एक समान टुकड़ा होता है। से प्रलेखन के as.Date
lmo

1900 से पहले के वर्षों के लिए, यह काम नहीं करता है। उदाहरण के लिए, मैंने यह कोशिश कीanytime('1870-01')
msh855

5

दरअसल, जैसा कि ऊपर उल्लेख किया गया है (और एसओ पर कहीं और), स्ट्रिंग को तिथि में बदलने के लिए, आपको महीने की एक विशिष्ट तारीख की आवश्यकता है। से as.Date()मैन्युअल पृष्ठ:

यदि तारीख स्ट्रिंग पूरी तरह से तारीख निर्दिष्ट नहीं करती है, तो लौटा हुआ उत्तर सिस्टम-विशिष्ट हो सकता है। सबसे आम व्यवहार यह मान लेना है कि एक लापता वर्ष, महीना या दिन वर्तमान है। यदि यह गलत तरीके से तारीख निर्दिष्ट करता है, तो विश्वसनीय कार्यान्वयन एक त्रुटि देगा और तारीख को एनए के रूप में सूचित किया जाता है। दुर्भाग्य से कुछ सामान्य कार्यान्वयन (जैसे glibc) अविश्वसनीय हैं और इच्छित अर्थ पर अनुमान लगाते हैं।

एक सरल समाधान यह होगा कि "01"प्रत्येक तिथि को तारीख पेस्ट करें और strptime()इसे उस महीने के पहले दिन के रूप में इंगित करने के लिए उपयोग करें।


आर में प्रसंस्करण की तारीखों और समय पर थोड़ी अधिक पृष्ठभूमि की मांग करने वालों के लिए:

आर में, समय का उपयोग होता है POSIXctऔर POSIXltकक्षा और दिनांक Dateकक्षा का उपयोग करते हैं ।

1 जनवरी, 1970 से तिथियों को दिनों की संख्या के रूप में संग्रहीत किया जाता है और 1 जनवरी, 1970 से सेकंड की संख्या के रूप में संग्रहीत किया जाता है।

इसलिए, उदाहरण के लिए:

d <- as.Date("1971-01-01")
unclass(d)  # one year after 1970-01-01
# [1] 365

pct <- Sys.time()  # in POSIXct
unclass(pct)  # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt)  # up is now a list containing the components of time
names(up)
# [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"  "zone"  
# [11] "gmtoff"
up$hour
# [1] 9

दिनांक और समय पर संचालन करने के लिए:

plt - as.POSIXlt(d)
# Time difference of 16420.61 days

और तिथियों को संसाधित करने के लिए, आप strptime()(इन उदाहरणों को मैनुअल पेज से उधार लेकर) उपयोग कर सकते हैं :

strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"

# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"

1

मुझे लगता है कि @ बेन-रोलर्ट का समाधान एक अच्छा समाधान है।

यदि आप इस समाधान का उपयोग नए पैकेज के अंदर करना चाहते हैं तो आपको सावधान रहना होगा।

पैकेज विकसित करते समय, यह सिंटैक्स का उपयोग करने की अनुशंसा की जाती है packagename::function_name()( http://kbroman.org/pkg_primer/pages/depends.html देखें )।

इस मामले में, आपको लाइब्रेरी as.Date()द्वारा परिभाषित संस्करण का उपयोग करना होगा zoo

यहाँ एक उदाहरण है :

> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-11-09                  

Packages --------------------------------------------------------------------------------------------------------------------------------------------------------

 package  * version date       source        
 devtools   1.12.0  2016-06-24 CRAN (R 3.3.1)
 digest     0.6.10  2016-08-02 CRAN (R 3.2.3)
 memoise    1.0.0   2016-01-29 CRAN (R 3.2.3)
 withr      1.0.2   2016-06-20 CRAN (R 3.2.3)

> as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) 
Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : 
  do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”

> zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"

इसलिए यदि आप एक पैकेज का विकास कर रहे हैं, तो उपयोग करने के लिए अच्छा अभ्यास है:

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.