将日期时间序列合并到多索引数据帧

时间:2021-05-27 19:43:28

标签: python pandas dataframe

我有一个多索引数据框:

tuples = list(zip(*[
    ['8000', '8000', '8000', '8100', '8100', '8200'],
    ['2021-04-02', '2021-04-05', '2021-04-06', '2021-04-02', '2021-04-10', '2021-04-28']
]))

idx = pd.MultiIndex.from_tuples(tuples, names=['cardNumber', 'date_only'])

values = [4, 4, 2, 5, 1, 2]

df = pd.DataFrame(data=values, index=idx, columns=['Count'])

df.index = df.index.set_levels([df.index.levels[0], pd.to_datetime(df.index.levels[1])])

我还有一个关于四月天的系列:

april_days = pd.date_range(start='2021-04-01', end='2021-04-30').to_series(index=None, name='Date')

df 中,不是每一天都会出现,所以我想将 april_daysdf 合并,这样如果没有观察就会有一个空值。

我试过 merge 没有运气和 concat where axis=1 但这也不起作用。如何合并这两个数据集?

1 个答案:

答案 0 :(得分:1)

一种可能的解决方案是基于现有索引创建新索引并重新索引数据帧。请注意,对于此解决方案,我不会为 april_days 创建系列对象:

april_days = pd.date_range(start='2021-04-01', end='2021-04-30')

为了创建新索引,我在 april_dates 中为每个日期重复 cardNumber 索引:

idx_1 = df.index.levels[0].repeat(len(april_days))

之后,我创建了一个新的时间索引。因此,我重复了 april_days 3 次,因为有三个 cardNumber。请注意,这里您需要另一种方法来重复,否则 april_dates 将具有以下顺序 [01.04, 01.04, 01.04, 02.04,...]。但是我们需要[01.04, 02.04, ..., 30.04, 01.04,...]。因此,我使用以下方法:

 import numpy as np
 idx_time = np.array([april_days.values] * 3).flatten()

现在我可以创建新的多索引:

idx = list(zip(idx_1, idx_time))

并重新索引现有数据框:

df.reindex(idx)
相关问题