如何使用pandas.date_range()获得在指定开始和结束日期之间的n个相等时间段的时间序列
我想要在一个开始日期和结束日期之间(包括这两个日期)获取一系列的n个日期,但是
dateIndex=pd.date_range(start=dt.datetime.today().date(), end=pd.to_datetime(expiry).date(), periods=n)
结果出现了ValueError错误:必须指定开始、结束或周期中的两个。我不能使用freq=Freq这个参数,因为我的日期范围不均匀——可能是从一个月到两年不等,所以我想要一个均匀间隔的时间序列,包含n个点。
谢谢!
2 个回答
3
从Pandas 0.23版本(或者更早的版本)开始,你可以像最开始那样直接使用 pandas.date_range
。这样做不会出错,而且结果也符合你的预期。举个例子:
pd.date_range('2016-01-01', '2017-01-01', periods=13, tz='utc')
Out[44]:
DatetimeIndex(['2016-01-01 00:00:00+00:00', '2016-01-31 12:00:00+00:00',
'2016-03-02 00:00:00+00:00', '2016-04-01 12:00:00+00:00',
'2016-05-02 00:00:00+00:00', '2016-06-01 12:00:00+00:00',
'2016-07-02 00:00:00+00:00', '2016-08-01 12:00:00+00:00',
'2016-09-01 00:00:00+00:00', '2016-10-01 12:00:00+00:00',
'2016-11-01 00:00:00+00:00', '2016-12-01 12:00:00+00:00',
'2017-01-01 00:00:00+00:00'],
dtype='datetime64[ns, UTC]', freq=None)
2016年有366天(因为那是闰年),所以时间戳之间相隔30.5天。
9
我觉得光用 date_range
可能做不到这一点,但为什么不试试 numpy 的 linspace
呢:
In [11]: start = pd.Timestamp('2012-01-01')
In [12]: end = pd.Timestamp('2012-02-01')
In [13]: np.linspace(start.value, end.value, 10) # 10 dates inclusive
Out[13]:
array([ 1.32537600e+18, 1.32567360e+18, 1.32597120e+18,
1.32626880e+18, 1.32656640e+18, 1.32686400e+18,
1.32716160e+18, 1.32745920e+18, 1.32775680e+18,
1.32805440e+18])
In [14]: pd.to_datetime(np.linspace(start.value, end.value, 10))
Out[14]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-01-01 00:00:00, ..., 2012-02-01 00:00:00]
Length: 10, Freq: None, Timezone: None
你 可以 把这个当作频率来用,但对于那些不能整除的时间,这样做可能会不准确:
In [21]: (end - start)/ 9
Out[21]: datetime.timedelta(3, 38400)
In [22]: ((end - start)/ 9).total_seconds()
Out[22]: 297600.0
# Note: perhaps there's a better way to pass this as a freq?
In [23]: pd.date_range(start=start, end=end, freq='%iS' % ((end - start)/ 9).total_seconds())
Out[23]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2012-01-01 00:00:00, ..., 2012-02-01 00:00:00]
Length: 10, Freq: 297600S, Timezone: None