【问题标题】:Merge datetime series to multi-index dataframe将日期时间序列合并到多索引数据框
【发布时间】:2021-05-27 19:43:28
【问题描述】:

我有一个多索引数据框:

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 其中axis=1 但这也不起作用。如何将这两个数据集结合起来?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案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)
    

    【讨论】:

    • 完美。非常感谢。我使用以下代码使时间索引动态化。 num_unique_cardNumber = len(df.index.levels[0])idx_time = np.array([april_days.values] * num_unique_cardNumber).flatten()
    猜你喜欢
    • 2012-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2023-02-23
    • 2021-05-20
    • 1970-01-01
    • 2020-06-25
    • 2021-03-08
    相关资源
    最近更新 更多