【问题标题】:Strip out months from two date columns从两个日期列中删除月份
【发布时间】:2017-06-13 15:47:46
【问题描述】:

我有一个 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     100      A
2/1/2017     100      A
3/1/2017     100      A
2/1/2017      50      B
3/1/2017      50      B

最终结果是对此进行旋转,然后在 x 轴上绘制月份,在 y 轴上绘制总需求

【问题讨论】:

    标签: python python-2.7 date pandas


    【解决方案1】:

    您可以先转换日期为to_datetime 的列。然后使用itertuplesdate_range 频率MS(月初)和concat 创建新的扩展DataFrame。最后join原创专栏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
    

    【讨论】:

    • 当我尝试这个时,列名没有设置。
    • 出了什么问题?有不同的列名吗?
    • df1.columns = ['Month','idx'] 不起作用/适用。之后df1的值是一样的
    • .reset_index() - 我收到缩进错误,所以我只是将其更改为 d1.reset_index() - 然后当我运行 df1.columns = ['Month','idx'] 时,它似乎没有效果。是因为 df1 是一个系列吗? (猜测)
    • 你可以像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()这样使用一行
    【解决方案2】:

    使用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
    

    【讨论】:

      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多