如何在python中创建时间戳的线性空间?

时间:2016-06-03 03:01:08

标签: python datetime numpy pandas

在给定开始/停止时期和所需数量的干预元素的情况下,有没有办法创建一系列等距日期时间对象?

t0 = dateutil.parser.parse("23-FEB-2015 23:09:19.445506")
tf = dateutil.parser.parse("24-FEB-2015 01:09:22.404973")
n = 10**4
series = pandas.period_range(start=t0, end=tf, periods=n)

这个例子失败了,也许pandas不打算给出频率短于一天的日期范围?

我可以手动估计一个频率,即(tf-t0)/ n,但是我担心,当我接近结束时期时,天生地重复地添加这个时间值(到开始时期)将累积显着的舍入误差。

我可以专门使用浮点数而不是日期时间对象。 (例如,从结束时期中减去开始时期,并将时间值除以某个单位,例如秒,然后简单地应用numpy linspace ..)但是将所有内容转换为浮动(并且仅在需要时转换回日期)会牺牲特殊数据类型的优点(更简单的代码调试)。这是最好的解决方案吗?

1 个答案:

答案 0 :(得分:4)

解决方法*是使用numpy' linspace

In [11]: np.linspace(pd.Timestamp("23-FEB-2015 23:09:19.445506").value, pd.Timestamp("24-FEB-2015 01:09:22.404973").value, 50, dtype=np.int64)
Out[11]:
array([1424732959445506048, 1424733106444678912, 1424733253443851520,
       1424733400443024384, 1424733547442197248, 1424733694441370112,
       1424733841440542720, 1424733988439715584, 1424734135438888448,
       1424734282438061312, 1424734429437233920, 1424734576436406784,
       ...
       1424739133410763520, 1424739280409936384, 1424739427409108992,
       1424739574408281856, 1424739721407454720, 1424739868406627584,
       1424740015405800192, 1424740162404973056])

In [12]: pd.DatetimeIndex(np.linspace(pd.Timestamp("23-FEB-2015 23:09:19.445506").value, pd.Timestamp("24-FEB-2015 01:09:22.404973").value, 50, dtype=np.int64))
Out[12]:
DatetimeIndex(['2015-02-23 23:09:19.445506048',
               '2015-02-23 23:11:46.444678912',
               '2015-02-23 23:14:13.443851520',
               '2015-02-23 23:16:40.443024384',
               ...
               '2015-02-24 01:04:28.406627584',
               '2015-02-24 01:06:55.405800192',
               '2015-02-24 01:09:22.404973056'],
              dtype='datetime64[ns]', freq=None)

*直接使用date_range

In [21]: pd.date_range("23-FEB-2015 23:09:19.445506", "24-FEB-2015 01:09:22.404973", periods=10**4)
...
ValueError: Must specify two of start, end, or periods