2013-02-22 12 views
6

के साथ स्ट्रैटाइम% z का उपयोग करके मैं टेराडाटा से निर्यात किए गए .csv डेटा के साथ काम कर रहा हूं। कई कॉलम मूल रूप से टाइमज़ोन के साथ टाइमस्टैम्प थे, इसलिए आर में .csv लोड करने के बाद मैं इन कॉलम (जो तारों के रूप में लोड होते हैं) को POSIXlt या POSIXct में कनवर्ट करना चाहते हैं। मैं strptime का उपयोग कर रहा हूं, लेकिन .csv फ़ाइल से टाइमज़ोन का प्रारूप strptime से मेल नहीं खाता है। उदाहरण के लिए, यह -0400 की अपेक्षा करता है लेकिन .csv प्रारूप -04:00 है जहां एक कोलन घंटे और मिनट को अलग करता है।विशेष टाइमज़ोन प्रारूप

मैं कोलन को हटा सकता हूं, लेकिन यह एक अतिरिक्त कदम और जटिलता है यदि मैं संभव से बचना चाहता हूं। टाइमज़ोन (%z) के लिए एक अलग प्रारूप का उपयोग करने के लिए strptime बताने का कोई तरीका है?

## Example data: 
x <- c("2011-10-12 22:17:13.860746-04:00", "2011-10-12 22:17:13.860746+00:00") 
format <- "%Y-%m-%d %H:%M:%OS%z" 

## Doesn't work: 
strptime(x,format) 
## [1] NA NA 

## Ignores the timezone: 
as.POSIXct(x) 
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 22:17:13 EDT" 

## Remove the last colon: 
x2 <- gsub("(.*):", "\\1", x) 
x2 
## [1] "2011-10-12 22:17:13.860746-0400" "2011-10-12 22:17:13.860746+0000" 

## This works, but requires extra processing (removing the colon) 
strptime(x2,format) 
## [1] "2011-10-12 22:17:13" "2011-10-12 18:17:13" 

तो मैं strptime(x,"%Y-%m-%d %H:%M:%OS%zz"), जहां %zz समयक्षेत्र कि -04:00 प्रारूप पहचानता के लिए एक कस्टम अभिव्यक्ति है की तरह कुछ का उपयोग कर यह पिछले परिणाम प्राप्त करने के लिए देख रहा हूँ:

यहाँ एक उदाहरण है। या %zH:%zM भी बेहतर हो सकता है।

यदि यह संभव नहीं है, तो क्या किसी के पास डेटा.फ्रेम/डेटा.table के एकाधिक कॉलम के लिए तारों (विभिन्न प्रारूपों) को परिवर्तित करने के लिए एक चिकना/लचीला फ़ंक्शन है?

उत्तर

3

यह पता चला lubridate इस प्रारूप को संभाल कर सकते हैं: स्थानीय समय क्षेत्र में प्रदर्शित करने के लिए

library(lubridate) 
ymd_hms(x) 
## [1] "2011-10-13 02:17:13 UTC" "2011-10-12 22:17:13 UTC" 

या,:

with_tz(ymd_hms(x)) 
## [1] "2011-10-12 22:17:13 EDT" "2011-10-12 18:17:13 EDT" 

अधिक लचीलेपन के लिए (अभी भी lubridate उपयोग करते हुए):

parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z") 

तेज गति के लिए (lubridate के बीच विकल्प):

lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO") 

समय:

microbenchmark(
    ymd_hms(x), 
    parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z"), 
    lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO"), 
    strptime(gsub("(.*):", "\\1", x), format) 
) 

## Unit: microseconds 
##            expr  min  lq  mean median  uq  max neval 
##           ymd_hms(x) 1523.819 1578.495 1715.14577 1629.5385 1744.3695 2850.393 100 
##   parse_date_time(x, "%Y-%m-%d %H:%M:%OS%z") 1108.676 1150.633 1273.77301 1190.3315 1264.8050 5947.204 100 
## lubridate:::.strptime(x, "%Y-%m-%d %H:%M:%OS%OO") 89.838 103.390 112.45338 107.8425 115.2265 216.512 100 
##  strptime(gsub("(.*):", "\\\\1", x), format) 46.716 58.294 71.90934 69.9415 86.5860 105.044 100 
2

मैं इस प्रश्न को पूरा करने की कोशिश कर रहा हूं।

एकमात्र चीज जिसे मैंने ठीक करने के लिए पाया है, है कि आपने उल्लेख किया है कि कोलन को हटाने के लिए रेगेक्स का उपयोग करना है। प्रतिस्थापन में गलतियों से बचने के लिए आप रेगेक्स को थोड़ा कस कर सकते हैं।

x2 <- gsub('^([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]+[+-][0-9]{2}):([0-9]{2})$', 
      '\\1\\2', 
      x) 
# [1] "2011-10-12 22:17:13.860746-0400" "2011-10-12 22:17:13.860746+0000" 
+4

यह 2016 है और दुनिया अभी भी इस से निपटने के लिए चल रहा है ... – sehe

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