Python中将月度数据转换为日度数据

4

我试图将一组月度数据转换为每周基础数据,但要达到这个目标,我需要将数据集分解为每日数据,然后聚合到每周水平。在聚合发生时(通过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等方法,但还没有完全解决问题。

1个回答

2
首先,使用 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.cumcount 创建辅助列,并在 resample 链中使用 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 - 没有数据,很难知道问题的解决方案...不幸的是没有头绪。 - jezrael
我已经为此创建了一个单独的问题。您介意看一下吗?它在这里:https://stackoverflow.com/questions/61475838/how-to-convert-monthly-numbers-to-weekly-considering-overlapping-weeks-between-m?noredirect=1#comment108748161_61475838 - vevek seetharaman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接