[英]Python Quantlib convert Quantlib Date to datetime
我有一个以 quantlib 的日期格式定义的日期列表。 如何将这些转换为日期时间格式。 我问的原因是,我想绘制它并且我收到了以下错误:
TypeError:float() 参数必须是字符串或数字,而不是“日期”
执行以下操作时:
plt.plot(dates,rates, linewidth=2.0) # Without date plotting works out.
日期如下所示:
[
Date(11,12,2012),
Date(12,12,2012),
Date(13,12,2012),
Date(14,12,2012),
Date(15,12,2012),
Date(16,12,2012),
Date(17,12,2012),
Date(18,12,2012),
Date(19,12,2012),
Date(20,12,2012)
]
没有预定义的转换,因此您必须从 QuantLib 日期中提取信息并使用它来构建datetime
时间实例。 例如,定义类似
def ql_to_datetime(d):
return datetime.datetime(d.year(), d.month(), d.dayOfMonth())
之后,您可以将ql_to_datetime(d)
用于单个日期,或[ ql_to_datetime(d) for d in dates ]
用于列表。 (当然,您也可以定义另一个获取列表的函数。)
更新:在最新版本的 QuantLib-Python 中,添加了预定义的转换。 您现在可以说d.to_date()
来转换日期,或者说[d.to_date() for d in dates]
来转换列表。
有一种更快的方法。 由于datetime.datetime
具有fromordinal()
和toordinal()
方法来在datetime.datetime
和表示日期的整数之间进行转换。 同样, ql.Date
也有方法serialNumber()
将ql.Date
转换为整数,并且它的构造函数也接受整数。 但是, datetime.datetime
使用0001-01-01
作为 1,增量为天,而ql.Date
使用1899-12-31
作为 0。因此,要在两者之间进行转换,我们可以使用以下函数:
def ql_to_datetime_new(d):
return datetime.datetime.fromordinal(d.serialNumber() + 693594)
其中693594
等于datetime.datetime(1899,12,31).toordinal()
- 1。为了测试速度,我还使用了 Luigi 回答中的函数:
def ql_to_datetime(d):
return datetime.datetime(d.year(), d.month(), d.dayOfMonth())
然后,按如下方式测试速度:
d = ql.Date(31, 12, 2000)
%timeit ql_to_datetime(d)
%timeit ql_to_datetime_new(d)
在我的电脑上,结果是
796 ns ± 18.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
436 ns ± 0.938 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
因此,我提出的那个更快。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.