DataFrame创建额外的间隔/范围/周期列



我有一个从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年的数据重叠,肯定会引发问题。有没有更聪明的方法在熊猫身上创造这样的间隔?

定义从最小日期开始的周数,并使用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

最新更新