Skip to main content
 首页 » 编程设计

python之在 Python 中使用日期时间的每月总金额

2025年05月04日20webabcd

现在我有了日期和值的列表,但我不知道如何使用日期结构进行计算。

看起来像

[[datetime.date(2018, 8, 10) 1076.2392505636847] 
 [datetime.date(2018, 8, 11) 3537.9781979862732] 
 [datetime.date(2018, 8, 12) 8637.536518161462] 
 [datetime.date(2018, 8, 13) 15660.768121458246] 
 [datetime.date(2018, 8, 14) 21087.477911830327] 
 [datetime.date(2018, 8, 15) 21087.477911830327] 
 [datetime.date(2018, 8, 16) 15660.768121458246] 
 [datetime.date(2018, 8, 17) 8637.536518161465] 
 [datetime.date(2018, 8, 18) 3537.9781979862732] 
 [datetime.date(2018, 8, 19) 1076.2392505636856]] 

我也知道

startdate = datetime.date(2018, 8, 10) 
enddate = datetime.date(2018,8, 19) 

我想创建另一个列表,其中包含 ['Year-Month' 数据,当月总和]。在这种情况下,它将只是 ['2018-8' 总和]。如果结束日期类似于 2020,8,19,则长度为 25(两年零一个月)。

你能分享一些我可能会用到的有用的功能/方法吗?

请您参考如下方法:

collections.defaultdict

您可以将 collections.defaultdict 用于不需要排序的 O(n) 解决方案。

import datetime 
 
L = [[datetime.date(2018, 8, 10), 1076.23], [datetime.date(2018, 8, 11), 3537.97], 
     [datetime.date(2018, 8, 19), 1076.23], [datetime.date(2018, 9, 10), 5.23], 
     [datetime.date(2018, 9, 11), 10.97], [datetime.date(2018, 10, 19), 15.23]] 
 
from collections import defaultdict 
 
d = defaultdict(int) 
 
for date, val in L: 
    d[date.strftime('%Y-%m')] += val 
 
# defaultdict(int, 
#             {'2018-08': 5690.43, 
#              '2018-09': 16.20, 
#              '2018-10': 15.23}) 
 
res = list(map(list, d.items())) 
 
print(res) 
 
[['2018-08', 5690.43], 
 ['2018-09', 16.20], 
 ['2018-10', 15.23]] 

Pandas

如果您乐于使用第 3 方库,可以使用 Pandas:

# construct dataframe from list of lists 
df = pd.DataFrame(L, columns=['date', 'val']) 
 
# convert to datetime 
df['date'] = pd.to_datetime(df['date']) 
 
# perform GroupBy operation over monthly frequency 
res = df.set_index('date').groupby(pd.Grouper(freq='M'))['val'].sum().reset_index() 
 
print(res) 
 
        date      val 
0 2018-08-31 5690.430 
1 2018-09-30   16.200 
2 2018-10-31   15.230