2015-02-20 15 views
6

Ho diversi DataFrames contenenti dati di serie temporali e vorrei creare una visualizzazione semplice dell'ampiezza degli intervalli di tempo per ciascuno di questi DataFrames. Dato che non ero in grado di generare questo con codice ho incluso uno schizzo per illustrare il mio obiettivo.Come tracciare un intervallo di tempo come valore da Pandas o MatPlotLib

Time Range Illustration

Ecco il codice per creare tre DataFrames che sono essenzialmente semplificati, le versioni più piccole dei DataFrames sto lavorando con.

from pandas import DataFrame 
from numpy import datetime64, random 

# example data recorded by two different sensors 
example_data = random.rand(5,2) 
example_data2 = random.rand(9,2) 
example_data3 = random.rand(9,2) 

# timestamps from sensor1 
times = ['2000-01-01 09:00:00', 
     '2000-01-01 09:15:00', 
     '2000-01-01 09:30:00', 
     '2000-01-01 09:45:00', 
     '2000-01-01 10:00:00'] 

# timestamps from sensor2 
times2 = ['2000-01-01 08:45:00', 
     '2000-01-01 09:00:00', 
     '2000-01-01 09:15:00', 
     '2000-01-01 09:30:00', 
     '2000-01-01 09:45:00', 
     '2000-01-01 10:00:00', 
     '2000-01-01 10:15:00', 
     '2000-01-01 10:30:00', 
     '2000-01-01 10:45:00'] 

# timestamps from sensor2 
times3 = ['2000-01-01 09:20:00', 
     '2000-01-01 09:40:00', 
     '2000-01-01 10:00:00', 
     '2000-01-01 10:20:00', 
     '2000-01-01 10:40:00', 
     '2000-01-01 11:00:00', 
     '2000-01-01 11:20:00', 
     '2000-01-01 11:40:00', 
     '2000-01-01 12:00:00'] 


# create the DataFrame object for sensor1 with the times and data above 
sensor1 = DataFrame({'Time': times, 
        'measure1': example_data[:,0], 
        'measure2': example_data[:,1]}) 

# create the DataFrame object for sensor2 with the times and data above 
sensor2 = DataFrame({'Time': times2, 
        'measure1': example_data2[:,0], 
        'measure2': example_data2[:,1]}) 

# create the DataFrame object for sensor2 with the times and data above 
sensor3 = DataFrame({'Time': times3, 
        'measure1': example_data3[:,0], 
        'measure2': example_data3[:,1]}) 

# coerce the 'Time' column from string to a numpy datetime64 value 
sensor1['Time'] = sensor1['Time'].astype(datetime64) 
sensor2['Time'] = sensor2['Time'].astype(datetime64) 
sensor3['Time'] = sensor3['Time'].astype(datetime64) 

ho cercato di prendere il minimo e il massimo valore datetime da ciascuno dei DataFrames e mettendoli in un nuovo dataframe ma quando provo e li tracciare ottengo un errore che non ci sono valori da tracciare.

Ho anche provato a prendere solo la colonna 'Ora' e assegnare un intero a una colonna 'valore' (cioè il sensore 1 ottiene la trasmissione Int 1 alla colonna 'valore', sensor2 get è la trasmissione Int 2 e così via), quindi unendo questi DataFrames.

Ma questo risulta in molti valori duplicati nella colonna "Ora" e nei valori Nan nella colonna "valore".

Ho esaurito le idee su come farlo funzionare.

EDIT: Corretto un '2001' timestamp subdolo nel blocco di codice ;-)

risposta

4
import numpy 
import pandas 

# create an index containing all time stamps 
idx1 = pandas.Index(sensor1.Time) 
idx2 = pandas.Index(sensor2.Time) 
idx3 = pandas.Index(sensor3.Time) 
df = pandas.DataFrame(index=idx1.union(idx2).union(idx3)) 

# create a (constant) Series for each sensor 
df['Sensor1'] = df.index.to_series().apply(lambda x: 3 if x >= sensor1.Time.min() and x <= sensor1.Time.max() else numpy.NaN) 
df['Sensor2'] = df.index.to_series().apply(lambda x: 2 if x >= sensor2.Time.min() and x <= sensor2.Time.max() else numpy.NaN) 
df['Sensor3'] = df.index.to_series().apply(lambda x: 1 if x >= sensor3.Time.min() and x <= sensor3.Time.max() else numpy.NaN) 

# plot 
p = df.plot(ylim=[0, 4], legend=False) 
p.set_yticks([1., 2., 3.]) 
p.set_yticklabels(['Sensor3', 'Sensor2', 'Sensor1']) 

A proposito, sei sicuro di avere 2001 nei tuoi timestamp? Ciò renderà il tuo tracciato Sensor1 invisibilmente piccolo.

+0

Grazie mille. E sì - hai ragione - l'ultimo timestamp del 2001 è stato un refuso, avrebbe dovuto anche essere "2000". –

0

+1 per la trama disegnata a mano. Mi piace iniziare il mio codice di visualizzazione con una trama disegnata a mano per identificare l'obiettivo in modo da non ottenere tracciamento laterale con la formattazione o cosa fare se scanarios.

Problemi correlati