如何为每个实体(多个分类字段)的每个缺失日期添加记录,并从值字段转发添加的条目?

2024-06-02 07:22:35 发布

您现在位置:Python中文网/ 问答频道 /正文

对于每个工厂/产品,我想为日期范围内的每个缺失日期添加一条记录。该范围基于最小/最大日期,与工厂/产品无关。然后,对于每个工厂/产品,我希望为每个新记录填写数量

这是我最初的熊猫数据帧的一个示例。我想把这个转过来:

Plant  Product Date         Qty
Austin A       2019-08-30   500
Austin A       2019-09-01   700
Austin A       2019-09-03   600
Austin B       2019-08-31   2000
Austin B       2019-09-02   2100
Austin B       2019-09-04   2200
Boston A       2019-08-31   50
Boston A       2019-09-02   60

为此:

Plant  Product Date         Qty
Austin A       2019-08-30   500
Austin A       2019-08-31   500
Austin A       2019-09-01   700
Austin A       2019-09-02   700
Austin A       2019-09-03   600
Austin A       2019-09-04   600
Austin B       2019-08-31   2000
Austin B       2019-09-01   2000
Austin B       2019-09-02   2100
Austin B       2019-09-03   2100
Austin B       2019-09-04   2200
Boston A       2019-08-31   50
Boston A       2019-09-01   50
Boston A       2019-09-02   60
Boston A       2019-09-03   60
Boston A       2019-09-04   60

在堆栈溢出postPandas filling missing dates and values within group中有一个解决方案,很接近, 但似乎只有在存在两个字段(除日期和数量/值外)时才起作用。当我尝试以下方法时:

ICG=ICG.set_index(
    ['Date', 'Plant', 'Product']).unstack().asfreq('D').stack().sort_index(level=1).reset_index()

我在asfreq()函数上收到一条错误消息:

TypeError: Cannot convert input [(Timestamp('2019-08-30 00:00:00'), 'Austin')] of type <class 'tuple'> to Timestamp

Tags: 数据数量dateindex产品工厂记录product
1条回答
网友
1楼 · 发布于 2024-06-02 07:22:35

Date列转换为日期时间数据类型。unstackstack解决方案可适用于双unstack,如下所示

df['Date'] = pd.to_datetime(df['Date'])
df_filled = (df.set_index(['Date', 'Plant', 'Product'])['Qty']
               .unstack([1,2]).asfreq('D').ffill().bfill()
               .unstack().reset_index(name='Qty'))

Out[50]:
     Plant Product       Date     Qty
0   Austin       A 2019-08-30   500.0
1   Austin       A 2019-08-31   500.0
2   Austin       A 2019-09-01   700.0
3   Austin       A 2019-09-02   700.0
4   Austin       A 2019-09-03   600.0
5   Austin       A 2019-09-04   600.0
6   Austin       B 2019-08-30  2000.0
7   Austin       B 2019-08-31  2000.0
8   Austin       B 2019-09-01  2000.0
9   Austin       B 2019-09-02  2100.0
10  Austin       B 2019-09-03  2100.0
11  Austin       B 2019-09-04  2200.0
12  Boston       A 2019-08-30    50.0
13  Boston       A 2019-08-31    50.0
14  Boston       A 2019-09-01    50.0
15  Boston       A 2019-09-02    60.0
16  Boston       A 2019-09-03    60.0
17  Boston       A 2019-09-04    60.0

相关问题 更多 >