具有不同时间戳和不同数据点的两个时间序列数据

时间:2017-10-10 12:07:09

标签: python r date dataframe time

我有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

任何人都可以请我开灯吗?

2 个答案:

答案 0 :(得分:2)

尝试使用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

答案 1 :(得分:1)

假设最后注释中给出的输入。将数据帧转换为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)