2017-01-27 2 views
1

У меня есть кадр данных панд, который имеет дату начала и окончания контрактов и количество. Как бы я выделил отдельные месяцы, чтобы их можно было агрегировать и графовать.Вывести месяцы из двух столбцов даты

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

полосы из месяцы к следующему

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 

конечный результат поворота этого, а затем граф с месяцев на оси х, а общий спрос на оси у

ответ

1

You могут сначала конвертировать столбцы с датами to_datetime. Затем используйте itertuples и date_range с частотой MS (начало месяца) с concat для создания новых расширяющихся DataFrame. Последние join оригинальные колонны Quantity Demanded и 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

, когда я пытаюсь это, имена столбцов не установлены. – user7480775

+0

Что было проблемой? Были разные имена столбцов? – jezrael

+0

df1.columns = ['Month', 'idx'] Не работает/применяется. Значение df1 является таким же после – user7480775

1

Использование melt затем 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 
Смежные вопросы