【问题标题】:Time zone missing from time series时间序列中缺少时区
【发布时间】:2017-08-16 16:31:48
【问题描述】:

我正在根据日期时间合并两个数据框,但似乎遇到了障碍。 2 个 DF 中的 1 个中的时间列具有时区标记:

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

而另一个DF时间列没有

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

在我的程序中,这两个都是 POSIXct 对象,格式完全相同 ,除了时区戳。当尝试根据时间列合并时,会出现 NA,b/c 他们没有相互识别。

我已将问题缩小到缺少 Tz 的 DF。一些奇怪的事情正在发生。当我在数据框之外有日期时间列的数据时,它会这样读取

#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

【问题讨论】:

  • 查看attributes(x) for Time1 和 Time2,我发现两者都没有 tz;并且您的代码运行良好,在 DATA 中没有可见的 NA....
  • 啊,完全错过了当我添加 POSIXct 行时,它向两个 data.frames 添加了一个 MDT。我将删除它,因为它不准确
  • 好的。随意以最能理解问题的方式重新组织您的问题;没有必要添加尾随 EDIT 等。人们可以看到编辑历史记录,如果适当的话,您可以向早期的回答者道歉,因为他们在 cmets 中对其进行了更改。
  • 罗杰,谢谢
  • @Frank 我做了更多的挖掘工作并缩小了问题的范围,并希望让我的问题更清楚。对于任何混淆,我深表歉意。

标签: r datetime merge posixct


【解决方案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

显示您的因子水平不同,这就是合并不起作用的原因。

【讨论】:

  • 感谢您的回复。是的,我意识到它们是示例中的因素,但在实际程序中,日期时间是一个 POSIXct 对象,因此它们的格式主要与您的示例相同,仅包括 %H:%M 。我想只使用 as.Date() 来转换它们,但必须先填充对象以检查丢失的数据。所以我唯一的选择是将它们保留在 POSIXct 中,尽管如果我可以摆脱时间戳,那应该会很好用
  • 鉴于示例中的代码,此答案是正确的 - 如果实际程序不同,我们需要查看它(或相关摘录)
  • 我已经缩小了问题的范围,并更清楚地说明了问题所在,对此感到抱歉。
【解决方案2】:

因此,经过多次尝试重新创建此错误后,我发现它是 包 zoo 的 na.locf 函数的罪魁祸首。在使用 pad 函数填充间隔“15 分钟”的数据后来自 padr,我想用列中的前一个值替换那些 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!

【讨论】:

  • 不应该这样。您能否制作一个可重现的示例并将其作为问题分享here?您可能在 pad 中发现了一个错误。
  • @Edwin 我确实找到了问题,它在于包 zoo 中的 na.locf 函数,我已将示例放在我的答案中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 2022-10-06
  • 2015-02-13
  • 2015-08-08
  • 2020-05-17
  • 2019-04-29
相关资源
最近更新 更多