[英]Converting Monthly Data to Daily Data in Python
我试图将每月数据点转换为每周一次但是为了达到这个目标,我将数据集打破到每日,然后将其汇总到周级别。 虽然聚合正在发生(通过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(因为2月份有28天)
我在其他方面搜索了ffill
,但无法完全解决问题
首先通过DataFrame.drop_duplicates
删除每列Month_End_Date
的重复DataFrame.drop_duplicates
,然后通过向前填充缺失值并最后过滤每月仅有28
行和每年的DataFrame.resample
:
#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
计数器创建辅助列,使用groupby
resample
链:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.