【问题标题】:How to create a linearspace of timestamps in python?如何在python中创建时间戳的线性空间?
【发布时间】:2016-10-02 23:34:50
【问题描述】:

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

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,但我担心天真地重复添加这个 timedelta(到开始时期)会在我接近结束时期时累积显着的舍入误差。

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

【问题讨论】:

  • 我确定你曾经能够做到这一点pd.date_range("23-FEB-2015 23:09:19.445506", "24-FEB-2015 01:09:22.404973", periods=10**4, freq=None)(你想要 date_range 而不是 period_range)。

标签: python datetime numpy pandas


【解决方案1】:

解决方法* 是使用 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

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2021-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多