【问题标题】:Continuous dates for products in PandasPandas 中产品的连续日期
【发布时间】:2021-03-24 06:41:00
【问题描述】:

我开始使用 Pandas,但遇到了一些我真的不知道如何解决的问题。

我有一个包含日期、产品、库存和销售额的数据框。缺少某些日期和产品。我想在一个日期范围内为每个产品获取一个时间序列。

例如:

           product  udsStock udsSales
date        
2019-12-26  14      161      848
2019-12-27  14      1340     914
2019-12-30  14      856      0
2019-12-25  4       3132     439
2019-12-27  4       3177     616
2020-01-01  4       500      883

所有产品的范围必须相同,即使一个产品没有出现在该范围内的某个日期。

如果我想要 2019-12-25 到 2020-01-01 的范围,最终的数据帧应该是这样的:

           product  udsStock udsSales
date
2019-12-25  14      NaN      NaN      
2019-12-26  14      161      848
2019-12-27  14      1340     914
2019-12-28  14      NaN      NaN
2019-12-29  14      NaN      NaN      
2019-12-30  14      856      0
2019-12-31  14      NaN      NaN
2020-01-01  14      NaN      NaN   
2019-12-25  4       3132     439
2019-12-26  4       NaN      NaN  
2019-12-27  4       3177     616
2019-12-28  4       NaN      NaN  
2019-12-29  4       NaN      NaN
2019-12-30  4       NaN      NaN
2019-12-31  4       NaN      NaN
2020-01-01  4       500      883

我尝试按范围重新索引,但它不起作用,因为有相同的索引。

idx = pd.date_range('25-12-2019', '01-01-2020')
df = df.reindex(idx)

我也尝试过按日期和产品索引,然后重新索引,但我不知道如何放置丢失的产品。

还有什么想法吗?

提前致谢

【问题讨论】:

    标签: python pandas dataframe time-series


    【解决方案1】:

    将索引转换为日期时间对象:

    df2.index = pd.to_datetime(df2.index)
    

    创建日期和产品的独特组合:

    import itertools
    
    idx = pd.date_range("25-12-2019", "01-01-2020")
    product = df2["product"].unique()
    temp = itertools.product(idx, product)
    temp = pd.MultiIndex.from_tuples(temp, names=["date", "product"])
    temp
    
    MultiIndex([('2019-12-25', 14),
                ('2019-12-25',  4),
                ('2019-12-26', 14),
                ('2019-12-26',  4),
                ('2019-12-27', 14),
                ('2019-12-27',  4),
                ('2019-12-28', 14),
                ('2019-12-28',  4),
                ('2019-12-29', 14),
                ('2019-12-29',  4),
                ('2019-12-30', 14),
                ('2019-12-30',  4),
                ('2019-12-31', 14),
                ('2019-12-31',  4),
                ('2020-01-01', 14),
                ('2020-01-01',  4)],
               names=['date', 'product'])
    

    重新索引数据框:

    df2.set_index("product", append=True).reindex(temp).sort_index(
        level=1, ascending=False
    ).reset_index(level="product")
    
    
              product   udsStock    udsSales
        date            
    2020-01-01  14       NaN    NaN
    2019-12-31  14       NaN    NaN
    2019-12-30  14      856.0   0.0
    2019-12-29  14      NaN     NaN
    2019-12-28  14      NaN     NaN
    2019-12-27  14      1340.0  914.0
    2019-12-26  14      161.0   848.0
    2019-12-25  14      NaN     NaN
    2020-01-01  4       500.0   883.0
    2019-12-31  4       NaN     NaN
    2019-12-30  4       NaN     NaN
    2019-12-29  4       NaN     NaN
    2019-12-28  4       NaN     NaN
    2019-12-27  4       3177.0  616.0
    2019-12-26  4       NaN     NaN
    2019-12-25  4       3132.0  439.0
    

    在 R 中,特别是 tidyverse,可以使用complete 方法来实现。在 Python 中,pyjanitor 包有一些 similar,但仍有一些问题需要解决(已经为此提交了 PR)。

    【讨论】:

      【解决方案2】:

      我们可以使用pd.date_rangegroupby.reindex 来实现您的结果:

      date_range = pd.date_range(start='2019-12-25', end='2020-01-01', freq='D')
      df = df.groupby('product', sort=False).apply(lambda x: x.reindex(date_range))
      df['product'] = df.groupby(level=0)['product'].ffill().bfill()
      df = df.droplevel(0)
      
                  product  udsStock  udsSales
      2019-12-25     14.0       NaN       NaN
      2019-12-26     14.0     161.0     848.0
      2019-12-27     14.0    1340.0     914.0
      2019-12-28     14.0       NaN       NaN
      2019-12-29     14.0       NaN       NaN
      2019-12-30     14.0     856.0       0.0
      2019-12-31     14.0       NaN       NaN
      2020-01-01     14.0       NaN       NaN
      2019-12-25      4.0    3132.0     439.0
      2019-12-26      4.0       NaN       NaN
      2019-12-27      4.0    3177.0     616.0
      2019-12-28      4.0       NaN       NaN
      2019-12-29      4.0       NaN       NaN
      2019-12-30      4.0       NaN       NaN
      2019-12-31      4.0       NaN       NaN
      2020-01-01      4.0     500.0     883.0
      

      【讨论】:

        猜你喜欢
        • 2015-09-16
        • 1970-01-01
        • 2015-02-25
        • 2019-03-24
        • 1970-01-01
        • 1970-01-01
        • 2021-08-19
        • 2019-05-17
        • 1970-01-01
        相关资源
        最近更新 更多