Python 熊猫间隔数据(有效期从&有效期到)到月末重采样

Python 熊猫间隔数据(有效期从&有效期到)到月末重采样,python,pandas,numpy,datetime,intervals,Python,Pandas,Numpy,Datetime,Intervals,我从一个数据库中提取数据,其中一组用户的收入存储在valid_from&valid_to dates中,每个用户可能有多个收入。我想制作一个逐行的数据集。在每一行上,我想显示每个用户在月末分组的情况 目前,我创建了一个新的数据框架,其中包含索引中所有可能的月末。然后我循环这个索引,并通过过滤原始数据集来填充相应的数据帧 import pandas as pd import numpy as np test_dict = {'valid_from': [np.datetime64('2001-0

我从一个数据库中提取数据,其中一组用户的收入存储在valid_from&valid_to dates中,每个用户可能有多个收入。我想制作一个逐行的数据集。在每一行上,我想显示每个用户在月末分组的情况

目前,我创建了一个新的数据框架,其中包含索引中所有可能的月末。然后我循环这个索引,并通过过滤原始数据集来填充相应的数据帧

import pandas as pd
import numpy as np

test_dict = {'valid_from': [np.datetime64('2001-01-01'),np.datetime64('2001-01-15'),np.datetime64('2001-06-20')],\
             'valid_to': [np.datetime64('2001-12-31'),np.datetime64('2001-04-15'),np.datetime64('2001-11-10')],\
             'user' : ['a','b','a'],\
             'income': [200,300,400]}
interval_data = pd.DataFrame(test_dict, columns=['valid_from','valid_to','user','income'])
end_of_month = pd.date_range(start = interval_data.valid_from.min(), end=interval_data.valid_to.max(), freq='M')

dfs = []
for x in end_of_month:
    fltr = (x >= interval_data.valid_from) & (x <= interval_data.valid_to)
    df = interval_data.loc[fltr, :].copy()
    df['date'] = x
    dfs.append(df)

df = pd.concat(dfs)
group = df.loc[:,['date','user','income']].groupby(['date','user']).sum()

print(interval_data)
print(group)
不过,我想有一种更有效的方法可以使用Pandas中的各种时间和日期函数来实现上述逻辑

有什么建议吗?

IIUC:

interval_data.groupby(level=0,group_keys=False, as_index=False)\
             .apply(lambda x: pd.DataFrame({'user':x.user.values,'income':x.income.values},
                                           index=pd.date_range(x.valid_from.values[0],
                                                               x.valid_to.values[0],
                                                               freq='M')))\
             .set_index('user',append=True).sort_index().sum(level=[0,1])
输出:

                 income
           user        
2001-01-31 a        200
           b        300
2001-02-28 a        200
           b        300
2001-03-31 a        200
           b        300
2001-04-30 a        200
2001-05-31 a        200
2001-06-30 a        600
2001-07-31 a        600
2001-08-31 a        600
2001-09-30 a        600
2001-10-31 a        600
2001-11-30 a        200
2001-12-31 a        200

基本上,如果我理解正确,您是在原始数据帧间隔_data中的每一行上循环,并在apply函数中创建每一行的数据帧?我不知道熊猫会自动合并这些新创建的数据帧。group_keys=False避免在使用apply时添加索引对我来说也是新的。是否可以从性能方面进行评论,或者这太依赖于原始数据帧?