根据时间戳值创建一个新列以按步骤计算天数
Create a new column based on timestamp values to count the days by steps
我想在我的数据集中添加一个与时间戳对应的列,并按步骤计算日期。也就是说,一年应该有 365 个“步骤”,我希望第 1 天每个帐户的所有分组付款都在此列中标记为 1,然后第 2 天的所有付款都标记为 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
我想在我的数据集中添加一个与时间戳对应的列,并按步骤计算日期。也就是说,一年应该有 365 个“步骤”,我希望第 1 天每个帐户的所有分组付款都在此列中标记为 1,然后第 2 天的所有付款都标记为 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