我想在数据集中添加一列,该列对应于时间戳,并按步骤计算日期。也就是说,一年应该有365";步骤";我希望第一天每个账户的所有分组付款在此列中标记为1,然后第二天的所有付款标记为2,以此类推,直到第365天。我希望它看起来像这样:
account time steps
0 A 2022.01.01 1
1 A 2022.01.02 2
2 A 2022.01.02 2
3 B 2022.01.01 1
4 B 2022.01.03 3
5 B 2022.01.05 5
我试过这个:
def day_step(x):
x['steps'] = x.time.dt.day.shift()
return x
df = df.groupby('account').apply(day_step)
然而,它只计算每个月,一旦新的月份开始,它就会从1开始。
我如何解决这个问题,使其提供全年的步数?
将GroupBy.transform
与first
或min
系列一起使用,减去列time
,将时间增量转换为天,然后添加1
:
df['time'] = pd.to_datetime(df['time'])
df['steps1'] = (df['time'].sub(df.groupby('account')['time'].transform('first'))
.dt.days
.add(1)
print (df)
account time steps steps1
0 A 2022-01-01 1 1
1 A 2022-01-02 2 2
2 A 2022-01-02 2 2
3 B 2022-01-01 1 1
4 B 2022-01-03 3 3
5 B 2022-01-05 5 5
第一个想法,只有当第一行是January 1
:时才工作
df['steps'] = df['time'].dt.dayofyear