【问题标题】:Converting Monthly Data to Daily Data in Python在 Python 中将每月数据转换为每日数据
【发布时间】:2019-06-24 16:53:47
【问题描述】:

我正在尝试将每月数据点集转换为每周数据点,但为了实现该目标,我将数据集分解为每日数据,然后将其汇总到每周级别。在聚合过程中(通过 groupby),我无法将数据分解为每日级别。

Month_End_Date  A   B   C   D
2/28/2019   Pikachu Starter 100000  5302
2/28/2019   Jolteon Evolution   250000  7935
3/31/2019   Charmander  Starter 62810   5103
3/31/2019   Bulbasaur   Starter 16868   6035
4/30/2019   Flareon Evolution   62810   5103
4/30/2019   Eevee   Starter 16868   6035
5/31/2019   Glaceon Evolution   62810   5103
5/31/2019   Leafeon Evolution   16868   6035
6/30/2019   Umbreon Evolution   62810   5103
6/30/2019   Espeon  Evolution   16868   6035

我正在尝试将第一行转换为

Month_End_Date  A   B   C   D
2/1/2019    Pikachu Starter 3571.428571 189.3571429
2/2/2019    Pikachu Starter 3571.428571 189.3571429
2/3/2019    Pikachu Starter 3571.428571 189.3571429
2/4/2019    Pikachu Starter 3571.428571 189.3571429
2/5/2019    Pikachu Starter 3571.428571 189.3571429

每日值除以 28(因为二月有 28 天)

我已经搜索了 ffill 等,但无法完全解决问题

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先通过DataFrame.drop_duplicates 删除每列Month_End_Date 的重复项,然后通过前向填充缺失值来删除DataFrame.resample,最后仅过滤28 每月和每年的行:

    #convert column to datetimes and then to first day of month
    df['Month_End_Date'] = (pd.to_datetime(df['Month_End_Date'], format='%m/%d/%Y')
                             .dt.to_period('m').dt.to_timestamp())
    df = df.drop_duplicates('Month_End_Date').set_index('Month_End_Date')
    #for duplicated last row of data
    df.loc[df.index[-1] + pd.offsets.MonthEnd(1)] = df.iloc[-1]
    df = df.resample('d').ffill()
    
    df1 = df[df.groupby(df.index.to_period('m')).cumcount() < 28]
    print (df1.tail())
                          A          B      C     D
    Month_End_Date                                 
    2019-06-24      Umbreon  Evolution  62810  5103
    2019-06-25      Umbreon  Evolution  62810  5103
    2019-06-26      Umbreon  Evolution  62810  5103
    2019-06-27      Umbreon  Evolution  62810  5103
    2019-06-28      Umbreon  Evolution  62810  5103
    

    如果需要所有值,不仅每个组首先使用GroupBy.cumcountresample 使用groupby 链按计数器创建帮助器列:

    df['Month_End_Date'] = (pd.to_datetime(df['Month_End_Date'], format='%m/%d/%Y')
                             .dt.to_period('m').dt.to_timestamp())
    df['g'] = df.groupby('Month_End_Date').cumcount()
    df = df.set_index('Month_End_Date')
    df.loc[df.index[-1] + pd.offsets.MonthEnd(1)] = df.iloc[-1]
    
    df = df.groupby('g').resample('d').ffill().reset_index(level=0, drop=True)
    df2 = df[df.groupby(['g', df.index.to_period('m')]).cumcount() < 28]
    print (df2.tail())
                         A          B      C     D  g
    Month_End_Date                                   
    2019-06-24      Espeon  Evolution  16868  6035  1
    2019-06-25      Espeon  Evolution  16868  6035  1
    2019-06-26      Espeon  Evolution  16868  6035  1
    2019-06-27      Espeon  Evolution  16868  6035  1
    2019-06-28      Espeon  Evolution  16868  6035  1
    

    【讨论】:

    • @vevekseetharaman - 很难知道没有数据的问题的解决方案......不幸的是不知道。
    • 我为此创建了一个单独的问题。你介意看看吗?在这里:stackoverflow.com/questions/61475838/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 2013-05-02
    • 2017-11-02
    • 2015-06-19
    • 2015-10-31
    • 2016-10-27
    相关资源
    最近更新 更多