python - 按动态日期范围从字典创建列表
问题描述
初始输入是一个 OrderedDict,如下所示:
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% |
+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+
对于不同的日期范围,它变得有点像一长行一样麻烦,所以我希望能够将其拆分,以便每年有一行,每个月有一列。我需要它是基于初始 OrderedDict 的动态的,但不确定如何最好地处理它。
解决方案
我猜你的意思是这样的:
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% | | | | | | |
+------+---------+----------+--------+--------+--------+-------+------+--------+-----------+---------+----------+----------+
推荐阅读
- php - 是否可以在 php 中使用正则表达式替换短语后的单词?
- javascript - 在 VueJS 中更新 Highcarts 系列数据形式的 axios 请求
- excel - 运行时的对象属性
- python - 如何将命令发送到 ipython 控制台会话
- javascript - 如何创建在移动和桌面之间动态变化的粘性标题(无汉堡包)
- c++ - 在模板化函数中推断函数重载
- git - 创建一个 git 挂钩以防止合并到本地存储库中的特定分支,但允许从远程拉取
- css - 试图使视频的缩略图图像具有响应性
- sql-server - 使用 Powershell 将 SQL Server 数据库还原到远程服务器时出错
- html - bootstrap 4 Grid,使用自定义水平装订线连续放置 4 个元素