python - 在 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
了其他东西,但无法完全解决问题
解决方案
Month_End_Date
首先通过 删除每列的重复项DataFrame.drop_duplicates
,然后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
推荐阅读
- signal-processing - 在 GNU Radio 上记录特定的带宽
- kubernetes - Pod 陷入关闭状态
- aws-dms - 表数据未加载到正确模式下的表中
- python - 收集json对象python中的子元素
- python - 导入一个模块时遇到问题,该模块本身在 Python 中导入另一个模块
- wordpress - 如何在 woocommerce 中编辑 do_action('woocommerce_cart_collaterals') 挂钩所包含的 HTML
- python - 如果不存在则插入节点,否则更新
- asp.net - inno Setup 6,如何在 Windows 10 中将 Web 应用程序部署到本地 IIS 10
- python - Celery - 台球多处理 - 在类中的任务中使用多处理的问题
- r - 将列名作为变量传递/循环到 data.table 和 ggplot