时间序列中缺少时区

时间:2017-08-16 16:31:48

标签: r datetime merge posixct

我正在根据日期时间合并两个数据框,似乎遇到了麻烦。 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合并,这不会遗漏任何东西

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

Changing time zones with POSIXct time series, R

2 个答案:

答案 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!