【问题标题】:DataFrame create additional interval/range/period columnDataFrame 创建额外的间隔/范围/周期列
【发布时间】:2020-08-04 11:27:02
【问题描述】:

我有一个从 2019 年 8 月到 2020 年 4 月的数据框。

我想向这个数据框添加一个列/分类变量,然后按这个新引入的列进行分组和聚合。

我在这个数据框中有一个日期列。 type(df["Date"].iloc[0]) 计算结果为 datetime.date

我在这个数据框中还有一列表示周df["Week]

到目前为止,我已经写了一个函数,它根据星期进行分类:

def time_intervals(week):
    if 33 <= week < 35:
        return "Interval 1"
    elif 35 <= week < 37:
        return "Interval 2"
    ....

然后将此函数映射到现有列。 df["Interval"] = df["Week"].map(time_intervals)

现在这不是最聪明的解决方案,一旦数据在 2019 年和 2020 年之间重叠,肯定会引起问题。有没有更聪明的方法在 pandas 中创建这样的间隔?

【问题讨论】:

    标签: python pandas dataframe timestamp range


    【解决方案1】:

    如何定义从最小日期开始的周数并使用 pd.cut 定义似乎每两周一次的间隔,例如:

    idx = pd.date_range('2019-08-01', '2020-04-30', freq='1D')
    data = np.random.rand(len(idx))
    
    # Example dataframe
    df = pd.DataFrame(dict(data=data), index=idx)
    min_date = df.index.min()
    
    # Number of weeks from min date
    df['week_from_start'] = (df.index - min_date).days//7
    bins = [x for x in range(0, df['week_from_start'].max()+2, 2)]
    
    # Define intervals using cut and some predefined bins
    df['Interval'] = pd.cut(df['week_from_start'], bins, labels=False, right=False)
    
    # Convert intervals from integers to strings
    df['Interval'] = 'Interval ' + (df['Interval'] + 1).astype(str)
    df['Interval'].iloc[[1,50,100]]
    
    # 2019-08-02    Interval 1
    # 2019-09-20    Interval 4
    # 2019-11-09    Interval 8
    

    【讨论】:

    • 非常感谢。我不知道 pd.cut 功能。我尝试过这样的事情:df["binned"] = pd.cut(df["Submit Date"], bins = 18)。这产生了可接受的结果。 df["Submit Date"] 的类型是时间戳,所以它似乎工作。如果我使用 datetime.date 类型的对象执行此操作,我会收到一条错误消息。不知道为什么,但这不是问题的一部分。
    • pd cut 用于连续变量,如 float 或 int,您不能在字符串、日期时间、时间增量等中使用它。
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多