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

ben*_*min 5 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)
Run Code Online (Sandbox Code Playgroud)

这个例子失败了,也许熊猫不是打算给日期范围设置比一天短的日期吗?

我可以手动估计频率,即(tf-t0)/ n,但是我担心,如果天真地反复将此时间增量(添加到开始时期),则在我接近结束时期时会累积大量舍入误差。

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

And*_*den 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)
Run Code Online (Sandbox Code Playgroud)

*直接使用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
Run Code Online (Sandbox Code Playgroud)