訂購日期串列:
[
datetime.date(2006, 8, 15),
datetime.date(2006, 9, 12),
datetime.date(2007, 8, 10),
datetime.date(2021, 4, 6),
datetime.date(2021, 4, 16),
datetime.date(2021, 4, 19)
...
]
我想要包含所有日期之間最多 30 天的日期的組(組的第一個元素與這些組的最后一個元素之間的距離將 <= 30 天)
例如,使用前面的串列,我會得到:
- group_1 = [datetime.date(2006, 8, 15), datetime.date(2006, 9, 12)](日期之間 <= 30 天)
- group_2 = [datetime.date(2021, 4, 6), datetime.date(2021, 4, 16), datetime.date(2021, 4, 19)] <=30
- group_3 = [datetime.date(2007, 8, 10)](沒有其他日期相關 <= 30 天)
我嘗試使用 iter-tools groupby 但關鍵函式不允許 2 個日期比較,例如“lambda x,y: (xy).days <= 30 ....” 我不知道我是否可以使用 groupby解決這個問題或者我需要其他 itertools 功能。我知道我可以為它構建一個 python 演算法,但我認為這將存在一個簡單的選項來解決這個問題,但我沒有找到它:(
謝謝!
uj5u.com熱心網友回復:
這是一個pandas將日期與下一個日期進行比較并檢查兩者之間是否有 30 天的解決方案。然后它分配一個組號cumsum:
import pandas as pd
import datetime
data = [ datetime.date(2006, 8, 15), datetime.date(2006, 9, 12), datetime.date(2007, 8, 10), datetime.date(2021, 4, 6), datetime.date(2021, 4, 16), datetime.date(2021, 4, 19)]
df = pd.DataFrame(data, columns=['date'])
df['groups'] = (df['date'].diff() > pd.Timedelta(30, unit='D')).cumsum()
輸出:
| 日期 | 團體 | |
|---|---|---|
| 0 | 2006-08-15 | 0 |
| 1 | 2006-09-12 | 0 |
| 2 | 2007-08-10 | 1 |
| 3 | 2021-04-06 | 2 |
| 4 | 2021-04-16 | 2 |
| 5 | 2021-04-19 | 2 |
或者,如果您只想將串列串列作為輸出: df.groupby((df['date'].diff() > pd.Timedelta(30, unit='D')).cumsum()).agg(list)['date'].to_list()
uj5u.com熱心網友回復:
在這種情況下,使用普通舊 for 回圈的迭代解決方案非常簡單。
我認為用它itertools來解決這個問題并不容易或有效,因為在這種情況下分組取決于資料的背景關系,這可能會產生 O(N^2) 解決方案,而迭代方法是 O(否)。
dts = [
datetime.date(2006, 8, 15),
datetime.date(2006, 9, 12),
datetime.date(2007, 8, 10),
datetime.date(2021, 4, 6),
datetime.date(2021, 4, 16),
datetime.date(2021, 4, 19)
]
def groupDateTimes(dts):
i = 0
ans = []
group = []
delta30days = datetime.timedelta(days=30)
while i < len(dts):
cur = dts[i]
if not group:
group.append(cur)
elif cur - group[0] <= delta30days:
group.append(cur)
else:
ans.append(group)
group = [cur]
i = 1
if group:
ans.append(group)
return ans
print(groupDateTimes(dts)) // [[datetime.date(2006, 8, 15), datetime.date(2006, 9, 12)], [datetime.date(2007, 8, 10)], [datetime.date(2021, 4, 6), datetime.date(2021, 4, 16), datetime.date(2021, 4, 19)]]
uj5u.com熱心網友回復:
itertools.groupby用于對不相互依賴的專案進行分組。在您的情況下,當當前日期比當前組的第一個日期晚 30 天以上時,通過插入新組來簡單地遍歷日期串列以構建組串列更容易也更清晰:
dates = [
datetime.date(2006, 8, 15),
datetime.date(2006, 9, 12),
datetime.date(2007, 8, 10),
datetime.date(2021, 4, 6),
datetime.date(2021, 4, 16),
datetime.date(2021, 4, 19),
datetime.date(2021, 5, 7)
]
threshold = datetime.timedelta(30)
groups = []
for date in dates:
if not groups or date - group[0] > threshold:
group = []
groups.append(group)
group.append(date)
groups 會成為:
[[datetime.date(2006, 8, 15), datetime.date(2006, 9, 12)],
[datetime.date(2007, 8, 10)],
[datetime.date(2021, 4, 6), datetime.date(2021, 4, 16), datetime.date(2021, 4, 19)],
[datetime.date(2021, 5, 7)]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/340399.html
標籤:Python 熊猫 算法 迭代工具 更多itertools
上一篇:函式以擴展形式回傳陣列中的數字?
