2016-03-23 11 views
1

Meine Rohdaten sieht wie folgt aus:konvertieren Datumsbereiche Time Series in Pandas

start_date end_date value 
0 2016-01-01 2016-01-03  2 
1 2016-01-05 2016-01-08  4 

Die Interpretation ist, dass die Daten einen Wert von zwischen 2016.01.01 und 1 nimmt/3/2016, und es nimmt einen Wert von 4 zwischen 2016.01.05 und 2016.01.08. Ich mag die Rohdaten zu einer täglichen Zeitreihen verwandeln wie folgt aus:

2016-01-01 2 
2016-01-02 2 
2016-01-03 2 
2016-01-04 0 
2016-01-05 4 
2016-01-06 4 
2016-01-07 4 
2016-01-08 4 

Beachten Sie, dass, wenn ein Datum in der Zeitreihe erscheint nicht zwischen dem start_date und end_date in jeder Zeile der rohe Daten, erhält es in der Zeitreihe den Wert 0.

Ich kann die Zeitreihe durch Schleifen der Rohdaten erstellen, aber das ist langsam. Gibt es einen schnelleren Weg?

+0

bitte Ihre erwartete Ausgabe oder diesen Zustand prüfen ', wenn ein Datum nicht in den Rohdaten angezeigt wird, erhält sie einen Wert von 0 '- warum haben Sie' Werte ! = 0' für die Daten: 01,02,05,06,07? – MaxU

+0

Entschuldigung für die Verwirrung. Hoffentlich machen die Änderungen es klarer. – hahdawg

Antwort

1

Sie können dies versuchen:

In [120]: df 
Out[120]: 
    start_date end_date value 
0 2016-01-01 2016-01-03  2 
1 2016-01-05 2016-01-08  4 

In [121]: new = pd.DataFrame({'dt': pd.date_range(df.start_date.min(), df.end_date.max())}) 

In [122]: new 
Out[122]: 
      dt 
0 2016-01-01 
1 2016-01-02 
2 2016-01-03 
3 2016-01-04 
4 2016-01-05 
5 2016-01-06 
6 2016-01-07 
7 2016-01-08 

In [123]: new = new.merge(df, how='left', left_on='dt', right_on='start_date').fillna(method='pad') 

In [124]: new 
Out[124]: 
      dt start_date end_date value 
0 2016-01-01 2016-01-01 2016-01-03 2.0 
1 2016-01-02 2016-01-01 2016-01-03 2.0 
2 2016-01-03 2016-01-01 2016-01-03 2.0 
3 2016-01-04 2016-01-01 2016-01-03 2.0 
4 2016-01-05 2016-01-05 2016-01-08 4.0 
5 2016-01-06 2016-01-05 2016-01-08 4.0 
6 2016-01-07 2016-01-05 2016-01-08 4.0 
7 2016-01-08 2016-01-05 2016-01-08 4.0 

In [125]: new.ix[(new.dt < new.start_date) | (new.dt > new.end_date), 'value'] = 0 

In [126]: new[['dt', 'value']] 
Out[126]: 
      dt value 
0 2016-01-01 2.0 
1 2016-01-02 2.0 
2 2016-01-03 2.0 
3 2016-01-04 0.0 
4 2016-01-05 4.0 
5 2016-01-06 4.0 
6 2016-01-07 4.0 
7 2016-01-08 4.0 
+0

Danke. Das ist Größenordnungen schneller als die Schleife, die ich verwendete. – hahdawg

+0

@hahdawg, froh, ich könnte helfen :) – MaxU

Verwandte Themen