我有每日数据,还有每月数据。我想按月编号对每日数据进行标准化 - 例如,2017年的前31天全部除以2017年1月对应的数据集。
import pandas as pd
import datetime as dt
N=100
start=dt.datetime(2017,1,1)
df_daily=pd.DataFrame({"a":range(N)}, index=pd.date_range(start, start+dt.timedelta(N-1)))
df_monthly=pd.Series([1, 2, 3], index=pd.PeriodIndex(["2017-1", "2017-2", "2017-3"], freq="M"))
df_daily["a"] / df_monthly # ???
我希望时间序列数据能够以一对多的方式对齐并执行所需的操作,但我获得了大量的NaN。
如何在Pandas中正确地进行这种一对多数据对齐?
我可能还希望连接数据,在这种情况下,我希望每月数据在一个月内复制值。
答案 0 :(得分:3)
您可以使用to_period('M')
提取信息,然后使用map
。
df_daily["month"] = df_daily.index.to_period('M')
df_daily['a'] / df_daily["month"].map(df_monthly)
如果不创建month
列,则可以使用
df_daily['a'] / df_daily.index.to_period('M').to_series().map(df_monthly)
答案 1 :(得分:0)
您可以从索引的月份创建临时密钥,然后合并密钥上的数据框,即
df_monthly = df_monthly.to_frame().assign(key=df_monthly.index.month)
df_daily = df_daily.assign(key=df_daily.index.month)
df_new = df_daily.merge(df_monthly,how='left').set_index(df_daily.index).drop('key',1)
a 0
2017-01-01 0 1.0
2017-01-02 1 1.0
2017-01-03 2 1.0
2017-01-04 3 1.0
2017-01-05 4 1.0
对于师,你可以简单地做:
df_new['b'] = df_new['a'] / df_new[0]