从两个日期列中去掉月份

2024-10-03 23:25:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据帧,有合同开始和结束日期和数量。我将如何剔除个别月份,以便它们可以聚合和图表化。你知道吗

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轴上的总需求绘制图表


Tags: 数据数量date图表绘制customerstartex
2条回答

可以首先转换日期为^{}的列。然后使用^{}^{}以及频率MS(月初)和^{}来创建新的扩展DataFrame。最后^{}原始列Quantity DemandedCustomer

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然后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

相关问题 更多 >