我有一本字典,其中字典的值是日期串列。對于每個鍵,如果在日期串列中存在彼此相隔 30 天(或更一般n的天)內的日期,我只想取最后一個列出的日期。
例如,我有一個字典如下:
a : ['2020-12-11']
b : ['2020-05-30', '2022-09-11']
c : ['2021-07-28', '2022-07-20', '2022-07-07', '2022-06-30']
d : ['2022-04-17', '2022-04-18', '2022-04-15', '2022-08-20']
現在,由于我只想獲取每個值在 30 天內列出的最后一個日期,因此我試圖獲得以下輸出:
a : ['2020-12-11']
b : ['2020-05-30', '2022-09-11']
c : ['2021-07-28', '2022-06-30']
d : ['2022-04-15', '2022-08-20']
輸出值不會改變a或b因為在彼此之間的 30 天范圍內沒有日期。自、和的c更改的輸出值彼此相距 30 天內,并且自最后列出以來,它保留在串列中(盡管在以后的日期)。因為, 應該發生同樣的事情 - , ,都在 30 天之內,但排在最后,所以我們想要這樣,而距離 30 多天,所以它也被保留了。2022-07-202022-07-072022-06-302022-06-302022-07-20d2022-04-172022-04-182022-04-152022-04-152022-08-20
如果有人知道如何幫助我解決這個問題,我將不勝感激,因為我不確定如何處理它,尤其是在計算上快速的方式。此外,如何將其概括為 60 天、100 天等?謝謝!
uj5u.com熱心網友回復:
只需遍歷字典,然后遍歷內部串列,將值轉換為日期時間并將它們與內部串列中的最后一個值進行比較
test_dict = {
"a" : ['2020-12-11'],
"b" : ['2020-05-30', '2022-09-11'] ,
"c" : ['2021-07-28', '2022-07-20', '2022-07-07', '2022-06-30'] ,
"d" : ['2022-04-17', '2022-04-18', '2022-04-15', '2022-08-20'],
}
from datetime import datetime, timedelta
def only_leave_last_date(d: dict, days_gap:int) -> dict:
new_dict = {}
for key, value in d.items():
if not value:
new_value_str = []
else:
new_value_dt = [datetime.strptime(value[0], '%Y-%m-%d')]
new_value_str = [value[0]]
for date_str in value[1:]:
date = datetime.strptime(date_str, '%Y-%m-%d')
if abs(date - new_value_dt[-1]) <= timedelta(days=days_gap):
new_value_dt[-1] = date
new_value_str[-1] = date_str
else:
new_value_dt.append(date)
new_value_str.append(date_str)
new_dict[key] = new_value_str
return new_dict
only_leave_last_date(test_dict, days_gap=30)
輸出:
{'a': ['2020-12-11'],
'b': ['2020-05-30', '2022-09-11'],
'c': ['2021-07-28', '2022-06-30'],
'd': ['2022-04-15', '2022-08-20']}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/524903.html
上一篇:驗證字串java中的日期(阻止錯誤,例如2月30日)
下一篇:SAS中減去月份
