Python 3.x 如何使用熊猫进行分组时间线填充?

Python 3.x 如何使用熊猫进行分组时间线填充?,python-3.x,pandas,Python 3.x,Pandas,首先,我看过所有的教程和帖子。它们要么基于较旧的Pandas API,要么都以总和/平均数/中值类型的示例作为结论。所以请听我说完 我试图使用Pandas从Postgres中的原始统计表中提取汇总表信息,按3个ID分组,每小时重新采样一次,0作为消耗的字节列。基本上,我想要一个每小时的时间轴,其中每个设备id的消耗字节相加,但没有记录/消耗字节的小时数为0。我希望有人能指出我的逻辑缺陷 以下是我的初始数据帧: df = pd.read_sql_query("SELECT date, o

首先,我看过所有的教程和帖子。它们要么基于较旧的Pandas API,要么都以总和/平均数/中值类型的示例作为结论。所以请听我说完

我试图使用Pandas从Postgres中的原始统计表中提取汇总表信息,按3个ID分组,每小时重新采样一次,0作为消耗的字节列。基本上,我想要一个每小时的时间轴,其中每个设备id的消耗字节相加,但没有记录/消耗字节的小时数为0。我希望有人能指出我的逻辑缺陷

以下是我的初始数据帧:

df = pd.read_sql_query("SELECT date, organization_id, device_id, consumed_bytes FROM %s;" % STAT_TABLE, con)
print(df)

                                  date  organization_id  device_id  consumed_bytes
0     2021-04-02 03:06:21.544000+00:00                1          1           74000
1     2021-04-02 03:06:21.544000+00:00                1          1          143000
2     2021-04-02 03:06:21.544000+00:00                1          1           23000
3     2021-04-02 03:06:21.544000+00:00                1          1          102000
4     2021-04-02 03:06:21.544000+00:00                1          1           66000
...                                ...              ...        ...             ...
14385 2021-04-06 02:46:21.544000+00:00                1          2           19000
14386 2021-04-06 02:50:21.544000+00:00                1          2           38000
14387 2021-04-06 02:54:21.544000+00:00                1          2          140000
14388 2021-04-06 02:58:21.544000+00:00                1          2           78000
14389 2021-04-06 03:02:21.544000+00:00                1          2           89000

[14390 rows x 4 columns]
下面是一个按日期、组织、设备分组的工作尝试,使用消耗的_字节进行汇总:

test1=df.groupby(by=["date", "organization_id", "device_id"]).sum('consumed_bytes')
print(test1)

                                                           consumed_bytes
date                             organization_id device_id                
2021-04-02 03:06:21.544000+00:00 1               1               114439000
                                                 2               116346000
2021-04-02 03:07:21.544000+00:00 1               1                   63000
                                                 2                  100000
2021-04-02 03:08:21.544000+00:00 1               1                  140000
...                                                                    ...
2021-04-06 02:54:21.544000+00:00 1               2                  140000
2021-04-06 02:58:21.544000+00:00 1               1                   28000
                                                 2                   78000
2021-04-06 03:02:21.544000+00:00 1               1                    5000
                                                 2                   89000

[6960 rows x 1 columns]
除了“id”求和之外(我想在我的select中过滤掉),它看起来还可以

这就是我遇到麻烦的地方

我需要每小时对数据帧进行重采样(),并用0个已消耗的字节填充缺失的小时数。我开始尝试重新采样('1H',on='date'):

这可能是因为在重新采样之前,我需要对DataFrameGroupBy对象执行一些操作。因此,我尝试在重新采样之前重置索引,它能够再次找到日期列:

df.groupby(by=["date", "organization_id", "device_id"]).sum('consumed_bytes').reset_index().resample('1H', on='date')

<pandas.core.resample.DatetimeIndexResampler object at 0x7fe0c118c3a0>
听着,我可以尝试列举所有我切片重采样的方法,但没有产生任何结果。我尝试过倒序(重新采样,然后尝试groupby),但运气不好

我尝试一下Pandas,因为我希望能够从这个数据集创建不同的摘要表(设备id、组织id、不同的时间线;按天、按分钟等),但是重采样返回的对象类型不能像数据帧(旧API)那样使用

有人能提供一个提示吗?如果这里没有足够的细节,我道歉。谢谢

df.groupby(by=["date", "organization_id", "device_id"]).sum('consumed_bytes').reset_index().resample('1H', on='date')

<pandas.core.resample.DatetimeIndexResampler object at 0x7fe0c118c3a0>
df.groupby(by=["date", "organization_id", "device_id"]).resample('1H', on='date').fillna(0)
*** KeyError: 'The grouper name date is not found'