Python Quantlib将Quantlib日期转换为datetime

5
我有一份用quantlib的日期格式定义的日期列表。如何将它们转换为datetime格式?我想绘制它,但我收到了以下错误信息:

TypeError: float() argument must be a string or a number, not 'Date'

当我执行以下操作时出现:

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)
]
2个回答

11

没有预定义的转换,因此您需要从QuantLib日期中提取信息并使用它来构建datetime实例。例如,定义类似于以下内容:

没有预先定义的转换,因此您需要从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]将列表中的日期转换为日期格式。


1
非常感谢,这正是我在寻找的 :). - MCM

0

有更快的方法。由于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)

因此,我提出的这个更快。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接