2012-10-31 9 views
16

मैं चरित्र के लिए और वापस POSIXct आर में मैं निम्नलिखित कोड चलाने में POSIXct परिवर्तित एक समस्या है:चरित्र POSIXct रूपांतरण डेलाइट बचत समय संक्रमण (CEST/सीईटी)) पर गलत समय क्षेत्र मूल्यों का कारण बनता है

time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10) 
time_seq_02 <- as.character(time_seq_01) 
time_seq_03 <- as.POSIXct(time_seq_02) 

या समकक्ष:

time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10) 
time_seq_02 <- format(time_seq_01,usetz = TRUE) 
time_seq_03 <- as.POSIXct(time_seq_02) 

यह 2012 में टाइम स्टाम्प्स हैं जब से मध्य यूरोपीय ग्रीष्मकालीन समय (CEST)मध्य यूरोपीय समय (सीईटी) OC के लिए डेलाइट बचत संक्रमण कर्सर (अक्टूबर 02:00 - 03:00 में अंतिम रविवार)।

जब मैं इन तत्वों फोन मैं

time_seq_01 
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST" 
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST" 
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET" 
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET" 
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET" 
time_seq_02 
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST" 
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST" 
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET" 
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET" 
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET" 
time_seq_03 
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST" 
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CET" 
[5] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST" 
[7] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CET" 
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET" 

एक POSIXct अनुक्रम के निर्माण पाने के सही ढंग से (time_seq_01) चरित्र भी (time_seq_02) के लिए संक्रमण काम करता है। हालांकि चरित्र से वापस POSIXct में संक्रमण गलत टाइमज़ोन (सीईटी/सीईएसटी) मान (time_seq_03) उत्पन्न करता है। यह स्पष्ट रूप से देखा जा सकता है जब उन तत्वों हल कर रहे हैं:

sort(time_seq_01) 
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:15:00 CEST" 
[3] "2012-10-28 02:30:00 CEST" "2012-10-28 02:45:00 CEST" 
[5] "2012-10-28 02:00:00 CET" "2012-10-28 02:15:00 CET" 
[7] "2012-10-28 02:30:00 CET" "2012-10-28 02:45:00 CET" 
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET" 
sort(time_seq_03) 
[1] "2012-10-28 02:00:00 CEST" "2012-10-28 02:00:00 CEST" 
[3] "2012-10-28 02:15:00 CEST" "2012-10-28 02:15:00 CEST" 
[5] "2012-10-28 02:30:00 CEST" "2012-10-28 02:30:00 CEST" 
[7] "2012-10-28 02:45:00 CET" "2012-10-28 02:45:00 CET" 
[9] "2012-10-28 03:00:00 CET" "2012-10-28 03:15:00 CET" 

यह जब उन timestamps द्वारा वस्तुओं विलय उदाहरण के लिए कई समस्याओं का कारण बनता है। क्या इस समस्या को दूर करने का कोई तरीका है?

प्रणाली मैं का उपयोग करें:

Windows 7 64bit 
R version 2.15.1 (2012-06-22) 
Platform: x86_64-pc-mingw32/x64 (64-bit) 
locale: 
[1] LC_COLLATE=German_Austria.1252 LC_CTYPE=German_Austria.1252 
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C     
[5] LC_TIME=German_Austria.1252  
attached base packages: 
[1] tools  stats  graphics grDevices utils  datasets methods 
[8] base  
other attached packages: 
[1] pkgtools_0.1-3 roxygen2_2.2.2 digest_0.5.2 rj_1.1.0-4  
loaded via a namespace (and not attached): 
[1] brew_1.0-6 plyr_1.7.1 rj.gd_1.1.0-1 stringr_0.6.1 
+2

आपका 'sessionInfo() 'क्या है? क्या आपने 'POSIXct' के * चेतावनी * खंड को पढ़ा है? –

+0

मैंने – kajo

+1

से ऊपर दिए गए प्रश्न में मेरी सत्र जानकारी जोड़ दी है क्या आपको 'as.POSIXct' में' tz' तर्क का उपयोग करने से प्रतिबंधित किया गया है? यह सेट किया जा सकता है, जिससे आप टाइमज़ोन को नियंत्रित कर सकते हैं। –

उत्तर

10

यहाँ कि चारों ओर एक काम मूल डेलाइट सेविंग टाइम स्थिति संरक्षण POSIXct से POSIXct को वापस character को जाता है।

Sys.setenv(TZ='Europe/Berlin') # to reproduce OP's example 
time_seq_01 <- seq(as.POSIXct("2012-10-28 02:00:00"), by = 900, length.out = 10) 
time_seq_02 <- format(time_seq_01,usetz = TRUE) 

time_seq_02_lt <- as.POSIXlt(time_seq_02) 
time_seq_02_lt$isdst <- as.POSIXlt(time_seq_01)$isdst 
time_seq_03 <- as.POSIXct(time_seq_02_lt) 

जहां तक ​​मेरा बता सकते हैं, स्ट्रिंग-से-दिनांक के लिए आर के समर्थन डीएसटी झंडे तार के भीतर निर्दिष्ट शामिल नहीं है।

+0

+1 - बहुत अच्छी तरह से किया गया! –

+2

इस संकेत के लिए धन्यवाद! एक समस्या जो बनी रही वह यह थी कि व्यावहारिक रूप से मेरे पास मूल POSIXct अनुक्रम उपलब्ध नहीं है और मुझे चरित्र अनुक्रम ('time_seq_02') से शुरुआत करना है। तो मैंने 'time_seq_02_lt $ isdst <- as.POSIXlt (time_seq_01) $ isdst' से' time_seq_02_lt $ isdst <- grepl ("CEST", time_seq_02) ' यह चाल है। मेरी राय में मूल समस्या यह है कि आपने कहा था कि डीएसटी ध्वज चरित्र में POSIXct रूपांतरणों में समर्थित नहीं हैं। इससे यह बहुत आसान हो जाएगा। – kajo

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