2017-01-27 4 views
1

Ich habe einen Pandas-Datenrahmen, der Verträge Start-und Enddatum und eine Menge hat. Wie würde ich die einzelnen Monate streichen, damit sie aggregiert und grafisch dargestellt werden können?Streifen Monate aus zwei Datumsspalten

ex 
Start Date End Date  Demanded  Customer 
1/1/2017 3/31/2017  100   A 
2/1/2017 3/31/2017   50   B 

Streifen aus den Monaten nach dem folgende

Month  Demand Customer 
1/1/2017  100  A 
2/1/2017  100  A 
3/1/2017  100  A 
2/1/2017  50  B 
3/1/2017  50  B 

Endergebnis sind

Antwort

1

Diese und dann Graph mit Monaten auf der x-Achse und den Gesamtbedarf auf der y-Achse zu schwenken, kann zuerst Spalten mit Daten to_datetime konvertieren. Verwenden Sie dann itertuples und date_range mit der Häufigkeit MS (Anfang des Monats) mit concat zum Erstellen neuer Erweiterungen DataFrame. Letzte join ursprünglichen Spalten Quantity Demanded und Customer:

df['Start_Date'] = pd.to_datetime(df['Start Date']) 
df['End_Date'] = pd.to_datetime(df['End Date']) 

df1 = pd.concat([pd.Series(r.Index, 
          pd.date_range(r.Start_Date, r.End_Date, freq='MS')) 
          for r in df.itertuples()]) 
     .reset_index() 
df1.columns = ['Month','idx'] 
print (df1) 
     Month idx 
0 2017-01-01 0 
1 2017-02-01 0 
2 2017-03-01 0 
3 2017-02-01 1 
4 2017-03-01 1 

df2 = df1.set_index('idx').join(df[['Quantity Demanded','Customer']]).reset_index(drop=True) 
print (df2) 
     Month Quantity Demanded Customer 
0 2017-01-01    100  A 
1 2017-02-01    100  A 
2 2017-03-01    100  A 
3 2017-02-01     50  B 
4 2017-03-01     50  B 
+0

wenn ich dies versuchen, nicht setzen die Spaltennamen. – user7480775

+0

Was war ein Problem? Es gab verschiedene Spaltennamen? – jezrael

+0

df1.columns = ['Monat', 'idx'] Funktioniert nicht/trifft nicht zu. Der Wert von df1 ist der gleiche nach – user7480775

1

Mit melt dann resample('MS')

df['Start Date'] = pd.to_datetime(df['Start Date']) 
df['End Date'] = pd.to_datetime(df['End Date']) 

d1 = pd.melt(
    df, ['Demanded', 'Customer'], 
    ['Start Date', 'End Date'], 
    value_name='Date' 
).drop('variable', 1).set_index('Date') 

d1.groupby('Customer').apply(lambda df: df.resample('MS').ffill()) \ 
    .reset_index(0, drop=True) \ 
    .reset_index() 

     Date Demanded Customer 
0 2017-01-01  100  A 
1 2017-02-01  100  A 
2 2017-03-01  100  A 
3 2017-02-01  50  B 
4 2017-03-01  50  B 
Verwandte Themen