Padd在Pandas系列中缺少日期

时间:2018-02-16 23:38:19

标签: python pandas time-series

我在数据帧上进行groupby和resample操作后创建了Panas系列对象。

我想填写最小和最大日期之间的缺失天数,每个item_type的数量为零。

    data = {'date_time': ['2018-01-22 12:40:03', '2018-01-22 13:40:03', '2018-01-23 15:00:05', '2018-01-26 14:30:04'], 
     'quantity': [11, 21, 23, 12], 'item_type': ['543', '543', '842', '543']}
    df = pd.DataFrame(data, columns = ['date_time', 'quantity' , 'item_type']) 
    df.index = df['date_time']
    df.index = pd.to_datetime(df.index)
    min_date = df.index.min()
    max_date = df.index.max()
    grouped = df.groupby('item_type').resample('D')['quantity'].sum()
    print(grouped)

>> Message: item_type   date_time 
543  2018-01-22    32.0
     2018-01-23     NaN
     2018-01-24     NaN
     2018-01-25     NaN
     2018-01-26    12.0
842  2018-01-23    23.0
Name: quantity, dtype: float64

如果我白天不进行重新采样,我可以获得一个可以迭代的groupby对象,然后从每个组创建一个数据框并获得总数,但总数不是当天:

grouped = df.groupby('item_type')
for item_type, group in grouped:
    df = group.groupby(['date_time']).sum()

如何获得每天每种商品类型的总数量,并根据下面所需的输出数量值为零,错过天数?

item_type   date_time  quantity
543  2018-01-22    32.0
     2018-01-23    0
     2018-01-24    0
     2018-01-25    0
     2018-01-26    12.0
842  2018-01-22    0
     2018-01-23    23.0
     2018-01-24    0
     2018-01-25    0
     2018-01-26    0

1 个答案:

答案 0 :(得分:2)

我不确定在 groupby期间执行会有多容易,但您确定可以在分组后执行此操作。使用pd.date_range然后reindex创建日期范围。

g = df.groupby('item_type').resample('D')['quantity'].sum()
dates = pd.date_range(
      g.index.levels[0].min(), g.index.levels[0].max()
) 
idx = pd.MultiIndex.from_product([g.index.levels[0], dates])

g.reindex(idx, fill_value=0)

543  2018-01-22    32
     2018-01-23     0
     2018-01-24     0
     2018-01-25     0
     2018-01-26    12
842  2018-01-22     0
     2018-01-23    23
     2018-01-24     0
     2018-01-25     0
     2018-01-26     0
Name: quantity, dtype: int64