增加日期直到 python 中不再有重复项
Increase date until there are no more duplicates in python
我有一个table,其中存储了客户的交易数据。购买日期总是在每月的第一天。如果客户在一个月内多次购买,则两张购买发票在同一天开具。
Date
CustomerID
01.02.20
1
01.03.20
1
01.03.20
1
01.03.20
1
为了进一步计算,我现在想通过将一个月内重复购买的日期增加一天来删除“重复项”。
我怎样才能通过 python 获得预期的结果?
Date
CustomerID
01.02.20
1
01.03.20
1
02.03.20
1
03.03.20
1
一种方法是按日期分组,然后根据特定客户 ID 的出现次数将它们转换为日期范围。
首先,我们希望 pandas 在内部将日期表示为实际日期而不是字符串。
df["Date"] = pd.to_datetime(df["Date"], format="%d.%m.%y")
接下来,我们按客户 ID 和日期对数据进行分组。在您的情况下,只有 2020 年,因此仅按月分组是可以的,但我们希望成为未来的证据,因此我们也将按年分组。 dt
引用“日期时间”并为我们获取相关信息。
gb = df.groupby(["CustomerID", df.Date.dt.year, df.Date.dt.month])
然后,我们可以适当地使用一些pandas魔法。对于每个组,我们得到第一个日期,该日期始终是给定月份的第一天。我们创建了一个天数范围,从那天开始,它与该组中的观察计数成正比,voilà。
idx = gb["Date"].transform(lambda x : pd.date_range(x.iloc[0],
periods=x.count(),
freq="D"))
idx
看起来像这样:
0 2020-02-01
1 2020-03-01
2 2020-03-02
3 2020-03-03
Name: Date, dtype: datetime64[ns]
最后,我们知道新创建的 idx
中的值与原始数据框中的值一样多,这意味着我们可以将此变量用作索引或用作新列。
(两者任选其一)
df.index = idx # as index
df["Date_fixed"] = idx # as column
N.B:如果给定月份的客户 ID 多于该月的天数,此解决方案可能会出现问题。所以你要小心 =)
我有一个table,其中存储了客户的交易数据。购买日期总是在每月的第一天。如果客户在一个月内多次购买,则两张购买发票在同一天开具。
Date | CustomerID |
---|---|
01.02.20 | 1 |
01.03.20 | 1 |
01.03.20 | 1 |
01.03.20 | 1 |
为了进一步计算,我现在想通过将一个月内重复购买的日期增加一天来删除“重复项”。 我怎样才能通过 python 获得预期的结果?
Date | CustomerID |
---|---|
01.02.20 | 1 |
01.03.20 | 1 |
02.03.20 | 1 |
03.03.20 | 1 |
一种方法是按日期分组,然后根据特定客户 ID 的出现次数将它们转换为日期范围。
首先,我们希望 pandas 在内部将日期表示为实际日期而不是字符串。
df["Date"] = pd.to_datetime(df["Date"], format="%d.%m.%y")
接下来,我们按客户 ID 和日期对数据进行分组。在您的情况下,只有 2020 年,因此仅按月分组是可以的,但我们希望成为未来的证据,因此我们也将按年分组。 dt
引用“日期时间”并为我们获取相关信息。
gb = df.groupby(["CustomerID", df.Date.dt.year, df.Date.dt.month])
然后,我们可以适当地使用一些pandas魔法。对于每个组,我们得到第一个日期,该日期始终是给定月份的第一天。我们创建了一个天数范围,从那天开始,它与该组中的观察计数成正比,voilà。
idx = gb["Date"].transform(lambda x : pd.date_range(x.iloc[0],
periods=x.count(),
freq="D"))
idx
看起来像这样:
0 2020-02-01
1 2020-03-01
2 2020-03-02
3 2020-03-03
Name: Date, dtype: datetime64[ns]
最后,我们知道新创建的 idx
中的值与原始数据框中的值一样多,这意味着我们可以将此变量用作索引或用作新列。
(两者任选其一)
df.index = idx # as index
df["Date_fixed"] = idx # as column
N.B:如果给定月份的客户 ID 多于该月的天数,此解决方案可能会出现问题。所以你要小心 =)