2017-10-10 3 views
0

J'ai des séries de données à 2 temps avec des horodatages différents et un nombre différent de points de données.Deux séries de données temporelles avec différents horodatages et un nombre différent de points de données

trame de données est d'abord:

 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 

Deuxième dataframe est:

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 

Les secondes valeurs de trames de données indiquent la valeur entre les deux dates mentionnées. Cela signifie que la valeur de '0' doit être propagée à partir du 10/9/2017 1:13:01 0 au 10/9/2017 1:42:10. et la valeur 1 à partir de la date du 10/9/2017 1:42:10 jusqu'au 10/9/2017 2:23:30 et ainsi de suite. Je souhaite avoir le même nombre de points de données que la première trame de données en fusionnant ces deux valeurs de colonnes de trames de données. J'ai beaucoup de trames de données similaires à la deuxième image qui m'aidera à faire des corrélations avec le temps.

Je suis en train d'obtenir le résultat suivant après la fusion: (. J'ai ajouté quelques points dans le résultat de représenter comment devraient ressembler ensemble des données)

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 

Je ne réfère à ces threads et leur but ne se propagent pas.

R: merge two irregular time series

merge two time series with different time granularities

Quelqu'un peut-il s'il vous plaît me jeter une lumière?

+0

Cela ressemble à une jointure non-équi pour moi. Recherchez ce terme et vous devriez obtenir un certain nombre de résultats. Si vous avez besoin de plus d'aide, veuillez inclure un exemple reproductible dans votre question (utilisez 'dput'). Ceci est particulièrement important pour les questions impliquant des variables de temps car cela nous aide à mieux comprendre votre structure de données et facilite la copie et le collage des données plutôt que de tenter de les construire à partir de rien. – lmo

Répondre

2

Essayez un roulement join En utilisant package de R data.table, qui est expliqué bien 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 
+0

Merci :) Je l'obtiens – Mari

1

On suppose les entrées données dans la note à la fin. Convertissez les trames de données en zoo et exécutez na.locf pour remplir les valeurs NA. Enfin, sélectionnez les éléments correspondant à la première table et éventuellement reconvertir trame de données:

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 

donnant:

   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 

Note: Nous supposons que les entrées suivantes. Notez que nous supposons des dates 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) 
+0

Merci c'est beaucoup de connaissances :) et ça marche. – Mari