Python 从两个日期列中去掉月份

Python 从两个日期列中去掉月份,python,python-2.7,date,pandas,Python,Python 2.7,Date,Pandas,我有一个熊猫数据框,它有合同的开始和结束日期以及数量。我将如何剔除单个月份,以便将其汇总和绘制 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 10

我有一个熊猫数据框,它有合同的开始和结束日期以及数量。我将如何剔除单个月份,以便将其汇总和绘制

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

最终的结果是将其作为轴心,然后在x轴上绘制月份图,在y轴上绘制总需求图。您可以首先将列转换为日期。然后使用频率为MS(月初)的和来创建新的扩展数据帧。最后原始列
需求量
客户

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

使用
melt
然后
重新采样('MS')


当我尝试此操作时,列名没有设置。出现了什么问题?有不同的列名?df1.columns=['Month','idx']不起作用/不适用。在.reset_index()之后,df1的值是相同的-我得到一个缩进错误,所以我只是将其更改为d1.reset_index()-然后当我运行df1.columns=['Month','idx']时,它似乎没有任何效果。是因为df1是一个系列吗?(猜测一下)您可以在df.itertuples()中为r使用一行,如
df1=pd.concat([pd.Series(r.Index,pd.date\u range(r.Start\u date,r.End\u date,freq='MS'))。reset\u Index()
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