我有一個存盤客戶交易資料的表。購買日期總是在每月的第一天給出。如果客戶在一個月內購買了多次,則兩張購買發票將在同一日期開具。
| 日期 | 客戶ID |
|---|---|
| 01.02.20 | 1 |
| 01.03.20 | 1 |
| 01.03.20 | 1 |
| 01.03.20 | 1 |
為了進一步計算,我現在想通過將一個月內重復購買的日期增加一天來消除“重復”。如何使用 python 獲得所需的結果?
| 日期 | 客戶ID |
|---|---|
| 01.02.20 | 1 |
| 01.03.20 | 1 |
| 02.03.20 | 1 |
| 03.03.20 | 1 |
uj5u.com熱心網友回復:
一種方法是按日期分組,然后根據某個客戶 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 魔法。對于每個組,我們得到第一個日期,它始終是給定月份的第一天。我們從那一天開始創建一系列天,這與該組中的觀察計數成正比,瞧。
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
注意:如果給定月份的客戶 ID 多于該月的天數,此解決方案可能會出現問題。所以你要小心那個=)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/447518.html
下一篇:應用腳本步進月份和日期格式
