我有一个从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