【问题标题】:Two Time series data with different time stamps and a different number of data points具有不同时间戳和不同数据点数量的两个时间序列数据
【发布时间】:2018-03-21 20:09:21
【问题描述】:

我有 2 个时间序列数据,具有不同的时间戳和不同数量的数据点。

第一个数据框是:

      Time         Power_kW
10/9/2017 1:14:12   0.185
10/9/2017 1:14:53   0.182
10/9/2017 1:15:13   0.184
10/9/2017 1:15:53   0.175
. . 
. . 
10/9/2017 1:44:37   0.175
. . 
. . 
10/9/2017 2:13:38   0.181
. . 
. . 
10/9/2017 2:24:40   0.179

第二个数据框是:

    Local Time    Value
10/9/2017 1:13:01   0
10/9/2017 1:42:10   1
10/9/2017 2:11:58   0
10/9/2017 2:23:30   1

第二个数据框值表示提到的两个日期之间的值。这意味着“0”的值应该从 10/9/2017 1:13:01 0 传播到 10/9/2017 1:42:10。以及从 10/9/2017 1:42:10 到 10/9/2017 2:23:30 等日期的值 1。

我希望通过合并这两个数据框列值来获得与第一个数据框相同数量的数据点。我有许多与第二个数据帧相似的数据帧,它们都将帮助我建立与时间相关的相关性。

我试图合并后得到以下结果:

   Time            Power_kW Value
10/9/2017 1:14:12   0.185   0
10/9/2017 1:14:53   0.182   0
10/9/2017 1:15:13   0.184   0
10/9/2017 1:15:53   0.175   0
. .     
. .     
10/9/2017 1:44:37   0.175   1
10/9/2017 1:45:47   0.176   1
. .     
10/9/2017 2:13:38   0.181   0
. .     
. .     
10/9/2017 2:24:40   0.179   1

(我在结果中添加了一些点来表示整个数据的外观。)

我确实提到了这些线程,它们的目的不是传播。

R: merge two irregular time series

merge two time series with different time granularities

谁能给我点一盏灯?

【问题讨论】:

  • 对我来说似乎是一个非 equi 连接。搜索那个词,你应该会得到一些点击。如果您需要更多帮助,请在您的问题中包含一个可重复的示例(使用dput)。这对于涉及时间变量的问题尤其重要,因为它可以帮助我们更好地理解您的数据结构,并且可以更轻松地复制和粘贴数据,而不是尝试从头开始构建数据。

标签: python r date dataframe time


【解决方案1】:

尝试使用 R 的 data.table 包进行滚动连接,这很好地解释了 in this blog

library(data.table)
df1 <- fread("Time,Power_kW
10/9/2017 1:14:12,0.185
10/9/2017 1:14:53,0.182
10/9/2017 1:15:13,0.184
10/9/2017 1:15:53,0.175
10/9/2017 1:44:37,0.175
10/9/2017 1:45:47,0.176 
10/9/2017 2:13:38,0.181
10/9/2017 2:24:40,0.179")
df2 <- fread("LocalTime,Value
10/9/2017 1:13:01,0
10/9/2017 1:42:10,1
10/9/2017 2:11:58,0
10/9/2017 2:23:30,1")
df1$Time <- as.POSIXct(df1$Time, format="%m/%d/%Y %T")
df2$LocalTime <- as.POSIXct(df2$LocalTime, format="%m/%d/%Y %T")
setkey(df1, Time)
setkey(df2, LocalTime)
df2[df1, roll=Inf]
# LocalTime Value Power_kW
# 1: 2017-10-09 01:14:12     0    0.185
# 2: 2017-10-09 01:14:53     0    0.182
# 3: 2017-10-09 01:15:13     0    0.184
# 4: 2017-10-09 01:15:53     0    0.175
# 5: 2017-10-09 01:44:37     1    0.175
# 6: 2017-10-09 01:45:47     1    0.176
# 7: 2017-10-09 02:13:38     0    0.181
# 8: 2017-10-09 02:24:40     1    0.179

【讨论】:

  • 谢谢 :) 我明白了
【解决方案2】:

假设最后的注释中给出的输入。将数据框转换为 zoo 并运行 na.locf 以填写 NA 值。最后选择第一个表对应的元素,并可选择转换回数据框:

library(zoo)

# convert to zoo
Power_kW <- read.zoo(DF1, tz = "")
Value <- read.zoo(DF2, tz = "")

z <- na.locf(merge(Power_kW, Value))[time(Power_kW)]
fortify.zoo(z) # optional

给予:

                Index Power_kW Value
1 2017-10-09 01:14:12    0.185     0
2 2017-10-09 01:14:53    0.182     0
3 2017-10-09 01:15:13    0.184     0
4 2017-10-09 01:15:53    0.175     0
5 2017-10-09 01:44:37    0.175     1
6 2017-10-09 01:45:47    0.176     1
7 2017-10-09 02:13:38    0.181     0
8 2017-10-09 02:24:40    0.179     1

注意:我们假设以下输入。请注意,我们假设 POSIXct 日期时间。

Lines1 <- "
Time,Power_kW
10/9/2017 1:14:12,0.185
10/9/2017 1:14:53,0.182
10/9/2017 1:15:13,0.184
10/9/2017 1:15:53,0.175
10/9/2017 1:44:37,0.175
10/9/2017 1:45:47,0.176 
10/9/2017 2:13:38,0.181
10/9/2017 2:24:40,0.179"

Lines2 <- "
LocalTime,Value
10/9/2017 1:13:01,0
10/9/2017 1:42:10,1
10/9/2017 2:11:58,0
10/9/2017 2:23:30,1"

fmt <- "%m/%d/%Y %H:%M:%S"
DF1 <- read.csv(text = Lines1)   
DF2 <- read.csv(text = Lines2)

# convert date/time to POSIXct
fmt <- "%m/%d/%Y %H:%M:%S"
DF1$Time <- as.POSIXct(DF1$Time, format = fmt)
DF2$LocalTime <- as.POSIXct(DF2$LocalTime, format = fmt)

【讨论】:

  • 谢谢你,这是很多知识 :) 并且它有效。
猜你喜欢
  • 2021-01-09
  • 1970-01-01
  • 2021-09-05
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2019-11-19
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多