我正在根据日期时间合并两个数据框,似乎遇到了麻烦。 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。奇怪的事情正在发生。当我在数据框外面有datetime列的数据时,它就是这样读的
#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"
现在,当我将其放入带数据的数据框时,“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,但现在没时间......
我不知道发生了什么,但我希望找到一种方法让MDT和其他所有人留在那个数据框中,这样我就可以成功地将它与其他DF合并,这不会遗漏任何东西
答案 0 :(得分: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
在您的版本中,您的时间转换为因素,这些因素在数据框架中不相等。例如,
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
向您显示您的因子级别不同,这就是合并不起作用的原因。
答案 1 :(得分:0)
因此,在多次尝试重新创建此错误之后,我发现它是包动物园的na.locf函数的罪魁祸首。在间隔“15分钟”和#39之后填充我的数据;使用padr的pad函数,我想用列中的前一个值替换那些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!