【问题标题】:Finding present values in a time frame, pandas在时间范围内查找现值,熊猫
【发布时间】:2020-10-14 19:07:59
【问题描述】:

我正在使用具有不同产品的数据框(每个产品都有不同的产品参考,在此数据框中为“PR”),它们具有特定的工作时间范围。

import pandas as pd
import numpy as np
np.random.seed(123)
df = pd.DataFrame({ 
    'PR':("1","2","3","4","5","18"),
    'StartDate':pd.date_range('1/1/2011', periods=6, freq='D'),
    'EndDate':np.random.choice( pd.date_range('1/1/2011', periods=365, 
                          freq='D'), 6, replace=False) 
    })

打印出这张表

                PR  StartDate   EndDate
           0    1   2011-01-01  2011-03-01
           1    2   2011-01-02  2011-11-06
           2    3   2011-01-03  2011-01-10
           3    4   2011-01-04  2011-10-27
           4    5   2011-01-05  2011-08-31
           5    18  2011-01-06  2011-06-06

我想找出在任何给定月份有多少产品在运行(在这种情况下:(2011-01,1 个产品在运行),(2011-02,5 个产品在运行),(2011-04,4 个产品在运行)等...我该怎么做?

【问题讨论】:

    标签: python pandas time


    【解决方案1】:

    如果给定产品在StartDateEndDate 范围内,您可以检查每个月。

    In [26]: pd.Series(
                {dt: ((df.StartDate <= dt) & (df.EndDate >= dt)).sum()
                 for dt in pd.date_range(start='2011-01-01', freq='1MS', periods=6)})
    Out[26]:       
    2011-01-01    1
    2011-02-01    5
    2011-03-01    5
    2011-04-01    4
    2011-05-01    4
    2011-06-01    4
    dtype: int64   
    

    【讨论】:

    • 谢谢!绝对是我想要的
    【解决方案2】:

    这是另一种方式:

    df.assign(dates = [pd.date_range(s,f, freq='MS') for s, f in zip(df['StartDate'], df['EndDate'])])\
      .explode('dates').groupby('dates')['PR'].nunique()
    

    输出:

    dates
    2011-01-01    1
    2011-02-01    5
    2011-03-01    5
    2011-04-01    4
    2011-05-01    4
    2011-06-01    4
    2011-07-01    3
    2011-08-01    3
    2011-09-01    2
    2011-10-01    2
    2011-11-01    1
    Name: PR, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 2019-11-09
      • 2021-06-15
      • 2020-11-26
      • 1970-01-01
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多