浮动日期转换

时间:2013-12-11 08:07:29

标签: python datetime numpy matplotlib pandas

我正在使用Pandas和Matplotlib创建两个相同的日期范围。在将numpy.float64转换为Pandas时间戳后,我有1分钟差异 - 为什么?

import pandas as pd
import matplotlib.dates as mdates
import datetime as dt

dstart = dt.date(2013,12,5)
dend = dt.date(2013,12,10)

d1 = pd.date_range(dstart, dend, freq='H')
d2 = mdates.drange(dstart, dend, dt.timedelta(hours=1))

print d1[2]
print pd.Timestamp(mdates.num2date(d2[2]))

得到结果:

2013-12-05 02:00:00
2013-12-05 02:01:00.504201+00:00

1 个答案:

答案 0 :(得分:2)

请注意,两个范围的长度也不相同:

>>> len(d1)
121
>>> len(d2)
120

我认为这可以被视为mdates.drange中的错误,但是因为您使用dates作为输入而没有使用datetimes而引入了错误(这也是文档字符串所说的内容)它应该是)。至少,我认为mdates.drange可以检查这一点 使用datetimes时,它符合预期:

In [50]: dstart = dt.datetime(2013,12,5)
In [51]: dend = dt.datetime(2013,12,10)
In [52]: d1 = pd.date_range(dstart, dend, freq='H')
In [53]: d2 = mdates.drange(dstart, dend, dt.timedelta(hours=1))
In [54]: print d1[2]
2013-12-05 02:00:00

In [55]: print pd.Timestamp(mdates.num2date(d2[2]))
2013-12-05 02:00:00+00:00

请注意,长度仍然不同,因为mdates.drange产生半开区间(因此dend不包括在内),而pd.date_range产生一个封闭区间。


对此失败原因的技术解释是,由于mdates.drangehttps://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/dates.py#L361),范围结束值的date计算错误。最终值将以小时为单位,但通过使用日期,忽略小时数,并创建错误的间隔。