我正在使用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
答案 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.drange
(https://github.com/matplotlib/matplotlib/blob/master/lib/matplotlib/dates.py#L361),范围结束值的date
计算错误。最终值将以小时为单位,但通过使用日期,忽略小时数,并创建错误的间隔。