2017-08-16 95 views
0

我在基於日期,時間合併兩個數據幀的過程中,似乎缺少已經遇到障礙。在的DF的2 1的時間列有一個時區戳:時區的時間序列

#Example 
    "2012-09-28 08:15:00 MDT" 

而另DF時間列不

#Example 2 
    "2012-09-28 08:15:00" 

在我的程序兩者都是POSIXct對象,完全格式化除了時區標記之外,還有相同的 。當試圖根據時間列進行合併時,NA出現,B/C它們不能相互識別。

我已經縮小問題下到DF缺少Tz的。奇怪的事情正在發生。當我有數據爲數據幀,當我把這個與數據的數據幀它的內容,例如

#Code used to make these values 
NewTime<-as.POSIXct(TimeDis$datetime, format="%Y-%m-%d %H:%M") 

>NewTime 
[1] "2017-08-16 00:00:00 MDT" "2017-08-16 00:15:00 MDT" 
[3] "2017-08-16 00:30:00 MDT" "2017-08-16 00:45:00 MDT" 

現在外面的DATETIME列,該「MDT」不露面

Discharge_Time<-data.frame(NewTime,DischargeFin) 
> Discharge_Time 
       NewTime DischargeFin 
1 2017-08-16 00:00:00  990525.2 
2 2017-08-16 00:15:00  990525.2 
3 2017-08-16 00:30:00 1000719.2 
4 2017-08-16 00:45:00 1000719.2 

即使我打電話的陌生人,

>Discharge_Time[1,1] 
"2017-08-16 MDT" 

我得到的MDT回來,但現在沒有時間....

我有n個o想法是怎麼回事,但我希望能找到一種方法讓MDT和其他所有人都能夠在該數據框中繼續使用,以便我可以成功地將它與其他DF進行合併,而不會丟失任何東西

Research完成: How to change a time zone in a data frame?

Changing time zones with POSIXct time series, R

+0

查看'屬性(x)'爲Time1和Time2,我看到沒有tz;並且你的代碼運行正常,在DATA中沒有可見的NA .... – Frank

+0

啊,完全錯過了當我添加POSIXct行時,它爲這兩個data.frames添加了一個MDT。我會刪除它,因爲它不準確 – Chabo

+0

好的。隨意以最能理解問題的方式重新組織您的問題;沒有必要添加尾部編輯等。人們可以看到編輯歷史,你可以道歉早期應答者中,如果適當的意見改變它在他們身上。 – Frank

回答

0

所以經過多次嘗試重現這個錯誤,我發現它的罪魁禍首包裝動物園na.locf功能。填充與來自PADR焊盤功能的間隔'15分鐘我的數據後,我想與該列中的前一值來取代那些N/A值。除了它在日期時間內擺脫TZ的事實之外,這很有效。這是問題的來源。一個例子如下所示

library(padr) 
library(zoo) 

#Dates Missing 8:30 for padding 
Dates<-c("2017-08-18 08:00","2017-08-18 08:15","2017-08-18 08:45", 
"2017-08-18 09:00") 

#Example Data 
Data<-c(1,2,3,4) 

#Df 
Df<-data.frame(Dates, Data) 

#Change to POSIXct 
Df$Dates<-as.POSIXct(Df$Dates, format="%Y-%m-%d %H:%M") 

#We can see now the Dates have been assigned a Timezone 
>Dates 
[1] "2017-08-18 08:00:00 MDT" "2017-08-18 08:15:00 MDT" 
[3] "2017-08-18 08:45:00 MDT" "2017-08-18 09:00:00 MDT" 

#Now we Pad 
Df<-pad(Df, interval='15 min') 

#TZ is still intact (So it's not padr) 
>Df[1,1] 
[1] "2017-08-18 08:00:00 MDT" 

#Here is where the problem lies, in the na.locf function from zoo 
library(zoo) 
FixDf<-na.locf(Df, option="locf") #replaces N/A with previous value 

FixDf[1,1] 
[1] "2017-08-18 08:00:00" #NO TIMEZONE! 
+0

它不應該這樣。你可以做一個可重複的例子,並分享它作爲一個問題[這裏](https://github.com/EdwinTh/padr/issues)?你可能在'pad'中發現了一個bug。 – Edwin

+0

@Edwin我真的發現了這個問題,它位於包動物園的na.locf函數中,我將這個例子放在我的答案中 – Chabo

1

嘗試

library(lubridate) 
Df1<-data.frame(Time1 = as_datetime(Time1),Data1) 
Df2<-data.frame(Time1 = as_datetime(Time2),Data2) 

DATA<-merge(x = Df1, y = Df2, by = "Time1", all.x = TRUE) 
DATA 
       Time1 Data1 Data2 
1 2012-09-28 06:15:00  1  5 
2 2012-09-28 06:30:00  2  6 
3 2012-09-28 06:45:00  3  7 

在你的版本,你的時間得到的轉換因素,這是不能跨dataframes相等。例如,

str(Df1$Time1) 
Factor w/ 3 levels "2012-09-28 08:15:00 MDT",..: 1 2 3 
str(Df2$Time1) 
Factor w/ 3 levels "2012-09-28 08:15:00",..: 1 2 3 

表明您的因素級別不同,這就是合併不起作用的原因。

+0

感謝您的回覆。是的,我意識到它們是示例中的因素,但在實際的程序中,日期時間是一個POSIXct對象,因此它們的格式化方式與您的示例基本相同,僅包括%H:%M。我想只是使用as.Date()來轉換它們,但必須先填充對象以檢查丟失的數據。所以我唯一的選擇是讓它們保持在POSIXct中,儘管如果我可以擺脫時間戳的話它應該可以工作 – Chabo

+1

這個答案在示例代碼中是正確的 - 如果實際程序不同,我們需要看到它(或相關摘錄) – gcbenison

+0

我已經縮小了這個問題的範圍,並且更清楚地說明問題所在,對此表示遺憾。 – Chabo