我来找你帮忙。问题是,我们有一个数据库(120万条记录),跟踪我们的客户的每月付款日期,但由于一个错误,日期已被设置为每个客户的第一个付款日期。(我在下面举个例子)
user fec
0 a 2016-12-08
1 a 2016-12-08
2 a 2016-12-08
3 a 2016-12-08
4 a 2016-12-08
5 b 2017-07-22
6 b 2017-07-22
7 b 2017-07-22
8 b 2017-07-22
9 b 2017-07-22
10 c 2017-04-13
11 c 2017-04-13
12 d 2018-11-26
13 d 2018-11-26
14 d 2018-11-26现在我们尝试纠正它们,使其看起来如下所示

老实说,我不知道如何解决这个问题,如果这里有人能指导我,我将不胜感激
发布于 2020-07-01 13:01:47
如果您只想为每个用户的每个连续日期添加1个月,您可以这样做:
import datetime
import calendar
import pandas as pd
df['fec'] = pd.to_datetime(df['fec'])
def add_months(sourcedate, months):
month = sourcedate.month - 1 + months
year = sourcedate.year + month // 12
month = month % 12 + 1
day = min(sourcedate.day, calendar.monthrange(year,month)[1])
return datetime.date(year, month, day)
df['fec'] = df.groupby('user')['fec'].agg(list).apply(lambda x: [add_months(x[0], i) for i in range(len(x))]).explode().values输出:
user fec
0 a 2016-12-08
1 a 2017-01-08
2 a 2017-02-08
3 a 2017-03-08
4 a 2017-04-08
5 b 2017-07-22
6 b 2017-08-22
7 b 2017-09-22
8 b 2017-10-22
9 b 2017-11-22
10 c 2017-04-13
11 c 2017-05-13
12 d 2018-11-26
13 d 2018-12-26
14 d 2019-01-26不过,这段令人讨厌的一行可能是一种更简单的方法,或者可以分成几个步骤
注-依赖于pandas v1.0.5+
发布于 2020-07-01 12:26:42
如果您愿意将所有日期移至月底:
df['fec'] = (df.groupby('user')['fec']
.transform(lambda x: pd.date_range(x.min(), freq='M',
periods=len(x))
)
)输出:
user fec
0 a 2016-12-31
1 a 2017-01-31
2 a 2017-02-28
3 a 2017-03-31
4 a 2017-04-30
5 b 2017-07-31
6 b 2017-08-31
7 b 2017-09-30
8 b 2017-10-31
9 b 2017-11-30
10 c 2017-04-30
11 c 2017-05-31
12 d 2018-11-30
13 d 2018-12-31
14 d 2019-01-31https://stackoverflow.com/questions/62669467
复制相似问题