按动态日期范围从字典创建列表

2024-05-16 08:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

初始输入是一个OrderedICT,如下所示:

    OrderedDict([(datetime.datetime(2019, 4, 30, 0, 0), 0.0947486624999998),    
    (datetime.datetime(2019, 5, 31, 0, 0), 0.08259463125856992), (datetime.datetime(2019, 6, 30,  
    0, 0), 0.003052897793393905), (datetime.datetime(2019, 7, 31, 0, 0), 0.028023122904952125), 
    (datetime.datetime(2019, 8, 31, 0, 0), 0.07684687634449605), (datetime.datetime(2019, 9, 30, 
    0, 0), -0.03725794433925611), (datetime.datetime(2019, 10, 31, 0, 0), 0.03144787467960408), 
    (datetime.datetime(2019, 11, 30, 0, 0), -0.14988101444115354), (datetime.datetime(2019, 12,   
    31, 0, 0), -0.05752055413222357), (datetime.datetime(2020, 1, 31, 0, 0), 
    0.11857140628117113), (datetime.datetime(2020, 2, 29, 0, 0), 0.021006728910266892), 
    (datetime.datetime(2020, 3, 31, 0, 0), -0.14603720278839682), (datetime.datetime(2020, 4, 
    30, 0, 0), -0.026798450818290687), (datetime.datetime(2020, 5, 31, 0, 0), 
    0.22529234127142295), (datetime.datetime(2020, 6, 30, 0, 0), 0.01974629608463685)])

目前,我正在使用下面的代码将日期拉出来放到一行中,并将值放到另一行中

    from prettytable import PrettyTable

    m = output.analyzers.trtnM.get_analysis()
    months = list(m.keys())
    months_date = [d.strftime('%m-%d-%Y') for d in months]
    returnsM = list(m.values())
    returnsM_2 = [str(round(num * 100, 2)) + "%" for num in returnsM]
    ptM = PrettyTable()
    ptM.title = 'Monthly Returns'
    ptM.field_names = months_date
    ptM.add_row(returnsM_2)

    print(ptM)

这看起来像:

+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|                                                                                         Monthly Returns                                                                                          |
+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
| 04-30-2019 | 05-31-2019 | 06-30-2019 | 07-31-2019 | 08-31-2019 | 09-30-2019 | 10-31-2019 | 11-30-2019 | 12-31-2019 | 01-31-2020 | 02-29-2020 | 03-31-2020 | 04-30-2020 | 05-31-2020 | 06-30-2020 |
+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
|   9.47%    |   8.26%    |   0.31%    |    2.8%    |   7.68%    |   -3.73%   |   3.14%    |  -14.99%   |   -5.75%   |   11.86%   |    2.1%    |   -14.6%   |   -2.68%   |   22.53%   |   1.97%    |
+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+

由于日期范围不同,它作为一个长行变得有点麻烦,所以我希望能够将其拆分,以便每年有一行,每个月有一列。我需要这是动态的基础上,最初的订单,但不确定如何最好地处理它


Tags: 代码infordatetimedatenumlistreturns
1条回答
网友
1楼 · 发布于 2024-05-16 08:33:00

我猜你的意思是这样的:

from prettytable import PrettyTable
import calendar

m = output.analyzers.trtnM.get_analysis()

returns = dict()
months = set()

for date, value in m.items():
    if date.year not in returns:
        returns[date.year] = {}
    returns[date.year][date.month] = value
    months.add(date.month)

months = list(sorted(months))

ptM = PrettyTable()
ptM.title = 'Monthly Returns'
ptM.field_names = ["Year"] + [calendar.month_name[month] for month in months]

for year in sorted(returns):
    values = returns[year]
    ptM.add_row([str(year)] + [f"{round(values[month]*100, 2)}%" if month in values else ""
                               for month in months])

print(ptM)

这将输出您的数据

+   +    -+     +    +    +    +   -+   +    +     -+    -+     +     +
| Year | January | February | March  | April  |  May   |  June | July | August | September | October | November | December |
+   +    -+     +    +    +    +   -+   +    +     -+    -+     +     +
| 2019 |         |          |        | 9.47%  | 8.26%  | 0.31% | 2.8% | 7.68%  |   -3.73%  |  3.14%  | -14.99%  |  -5.75%  |
| 2020 |  11.86% |   2.1%   | -14.6% | -2.68% | 22.53% | 1.97% |      |        |           |         |          |          |
+   +    -+     +    +    +    +   -+   +    +     -+    -+     +     +

相关问题 更多 >