Python 将每月数据转换为季度数据

Python 将每月数据转换为季度数据,python,pandas,Python,Pandas,我有按ID分组的月度数据,ID也有父ID。数据如下所示: data = pd.DataFrame({'parent_id': [1, 1, 1, 1, 1, 1, -99999, -99999, -99999], 'id': [123, 123, 123, 123, 123, 123, 123, 123, 123], 'data_1': [10, 20, 30, 40, 50, 60, 0, 0, 0],

我有按ID分组的月度数据,ID也有父ID。数据如下所示:

data = pd.DataFrame({'parent_id': [1, 1, 1, 1, 1, 1, -99999, -99999, -99999],
                     'id': [123, 123, 123, 123, 123, 123, 123, 123, 123],
                     'data_1': [10, 20, 30, 40, 50, 60, 0, 0, 0],
                     'data_2': [10, 20, 30, 40, 50, 60, 0, 0, 0],
                     'period': [0, 1, 2, 3, 4, 5, 6, 7, 8],
                     'date': ['2017-06-30', '2017-07-31', '2017-08-31',
                              '2017-09-30', '2017-10-31', '2017-11-30',
                              '2017-12-31', '2018-01-31', '2018-02-28'],
                     'quarter': [0, 0, 0, 1, 1, 1, 2, 2, 2]})

data_2 = pd.DataFrame({'parent_id': [1, 1, 1, 1, 1, 1, -99999, -99999, -99999],
                     'id': [234, 234, 234, 234, 234, 234, 234, 234, 234],
                     'data_1': [10, 20, 30, 40, 50, 60, 0, 0, 0],
                     'data_2': [10, 20, 30, 40, 50, 60, 0, 0, 0],
                     'period': [0, 1, 2, 3, 4, 5, 6, 7, 8],
                     'date': ['2017-06-30', '2017-07-31', '2017-08-31',
                              '2017-09-30', '2017-10-31', '2017-11-30',
                              '2017-12-31', '2018-01-31', '2018-02-28'],
                     'quarter': [0, 0, 0, 1, 1, 1, 2, 2, 2]})

data = data.append(data_2)
data = data.reindex()
我有一个函数,当我有一个id时可以工作,但是当我引入多个id时,求和不是唯一的

def convert_to_quarterly(df, date):
    """Aggregates 3 months of data to a quarterly value."""
    columns = ['data_1', 'data_2']
    df['date'] = pd.to_datetime(df['date'])
    df = df.set_index('date')
    df_quarterly = df.resample('Q')[columns].sum()
    df_quarterly['date'] = df_quarterly.index
    df['date'] = df.index
    df.drop(columns, axis=1, inplace=True)
    df = pd.merge(df, df_quarterly)

    return df

convert_to_quarterly(data, date=pd.to_datetime('2017-06-30'))

我需要做什么才能使Pandas仅对单个ID组求和?

如果您尚未这样做,则需要将日期列正式设置为datetime类型。然后可以使用groupby,然后再进行重采样

data['date'] = data['date'].astype('datetime64[ns]')
data.set_index('date').groupby('id').resample('Q')['data_1', 'data_2'].sum()

                data_1  data_2
id  date                      
123 2017-06-30      10      10
    2017-09-30      90      90
    2017-12-31     110     110
    2018-03-31       0       0
234 2017-06-30      20      20
    2017-09-30     180     180
    2017-12-31     220     220
    2018-03-31       0       0

如果您还没有这样做,则需要将日期列正式设置为datetime类型。然后可以使用groupby,然后再进行重采样

data['date'] = data['date'].astype('datetime64[ns]')
data.set_index('date').groupby('id').resample('Q')['data_1', 'data_2'].sum()

                data_1  data_2
id  date                      
123 2017-06-30      10      10
    2017-09-30      90      90
    2017-12-31     110     110
    2018-03-31       0       0
234 2017-06-30      20      20
    2017-09-30     180     180
    2017-12-31     220     220
    2018-03-31       0       0

非常感谢你!这正是我要找的!我不敢相信我一步一步地错过了小组赛。你是救命恩人!我一定会买你的书,跟着你。谢谢你的帮助@汤姆库萨克:当然。谢谢你的支持。因为这个问题,我发现了一个bug。您不必将日期列放入带有
set\u index
的索引中,因为重采样有一个
on
参数,但在这种情况下它不起作用。非常感谢你!这正是我要找的!我不敢相信我一步一步地错过了小组赛。你是救命恩人!我一定会买你的书,跟着你。谢谢你的帮助@汤姆库萨克:当然。谢谢你的支持。因为这个问题,我发现了一个bug。您不必将日期列放入带有
set\u index
的索引中,因为重采样有一个
on
参数,但在这种情况下它不起作用。