【问题标题】:How to combine daily data with monthly data in Pandas?如何在 Pandas 中结合每日数据和每月数据?
【发布时间】:2018-07-08 09:36:36
【问题描述】:

我有每日数据,也有每月数据。我想按月数对每日数据进行标准化 - 例如,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 中正确地进行这种一对多数据对齐?

我可能还想连接数据,在这种情况下,我希望每月数据在一个月内重复值。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用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)
    

    【讨论】:

      【解决方案2】:

      您可以从索引的月份创建一个临时键,然后合并键上的两个数据框,即

      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]
      

      【讨论】:

        猜你喜欢
        • 2015-06-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多