增加日期直到 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 多于该月的天数,此解决方案可能会出现问题。所以你要小心 =)