Pandas:使用 Jump 生成顺序时间戳

Plu*_*ug4 0 python indexing timestamp pandas

我有一个具有以下索引的 df

df.index
>>> [2010-01-04 10:00:00, ..., 2010-12-31 16:00:00]
Run Code Online (Sandbox Code Playgroud)

主列是volume

在时间戳序列中,周末和其他一些工作日不存在。我想重新采样我的时间索引以获得每分钟音量的总和。所以我执行以下操作:

df = df.resample('60S', how=sum)

缺少一些分钟。换句话说,有几分钟没有交易。我想包括这些缺失的分钟数并在列中添加一个 0 volume。为了解决这个问题,我通常会这样做:

new_range = pd.date_range('20110104 09:30:00','20111231 16:00:00',
                          freq='60s')+df.index
df = df.reindex(new_range)
df = df.between_time(start_time='10:00', end_time='16:00') # time interval per day that I want
df = df.fillna(0)
Run Code Online (Sandbox Code Playgroud)

但现在我被困在不需要的日期上,比如周末和其他一些日子。如何摆脱最初不在我的时间戳索引中的日期?

Jef*_*eff 6

只需构建您想要的日期时间范围并重新编制索引即可。

全系列

In [9]: rng = pd.date_range('20130101 09:00','20130110 16:00',freq='30T')

In [10]: rng
Out[10]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:00:00, ..., 2013-01-10 16:00:00]
Length: 447, Freq: 30T, Timezone: None
Run Code Online (Sandbox Code Playgroud)

消除超出范围的时间

In [11]: rng = rng.take(rng.indexer_between_time('09:30','16:00'))

In [12]: rng
Out[12]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:30:00, ..., 2013-01-10 16:00:00]
Length: 140, Freq: None, Timezone: None
Run Code Online (Sandbox Code Playgroud)

消除非工作日

In [13]: rng = rng[rng.weekday<5]

In [14]: rng
Out[14]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-01-01 09:30:00, ..., 2013-01-10 16:00:00]
Length: 112, Freq: None, Timezone: None
Run Code Online (Sandbox Code Playgroud)

只看这些值,你可能想要 df.reindex(index=rng)

In [15]: rng.to_series()
Out[15]: 
2013-01-01 09:30:00   2013-01-01 09:30:00
2013-01-01 10:00:00   2013-01-01 10:00:00
2013-01-01 10:30:00   2013-01-01 10:30:00
2013-01-01 11:00:00   2013-01-01 11:00:00
2013-01-01 11:30:00   2013-01-01 11:30:00
2013-01-01 12:00:00   2013-01-01 12:00:00
2013-01-01 12:30:00   2013-01-01 12:30:00
2013-01-01 13:00:00   2013-01-01 13:00:00
2013-01-01 13:30:00   2013-01-01 13:30:00
2013-01-01 14:00:00   2013-01-01 14:00:00
2013-01-01 14:30:00   2013-01-01 14:30:00
2013-01-01 15:00:00   2013-01-01 15:00:00
2013-01-01 15:30:00   2013-01-01 15:30:00
2013-01-01 16:00:00   2013-01-01 16:00:00
2013-01-02 09:30:00   2013-01-02 09:30:00
...
2013-01-09 16:00:00   2013-01-09 16:00:00
2013-01-10 09:30:00   2013-01-10 09:30:00
2013-01-10 10:00:00   2013-01-10 10:00:00
2013-01-10 10:30:00   2013-01-10 10:30:00
2013-01-10 11:00:00   2013-01-10 11:00:00
2013-01-10 11:30:00   2013-01-10 11:30:00
2013-01-10 12:00:00   2013-01-10 12:00:00
2013-01-10 12:30:00   2013-01-10 12:30:00
2013-01-10 13:00:00   2013-01-10 13:00:00
2013-01-10 13:30:00   2013-01-10 13:30:00
2013-01-10 14:00:00   2013-01-10 14:00:00
2013-01-10 14:30:00   2013-01-10 14:30:00
2013-01-10 15:00:00   2013-01-10 15:00:00
2013-01-10 15:30:00   2013-01-10 15:30:00
2013-01-10 16:00:00   2013-01-10 16:00:00
Length: 112
Run Code Online (Sandbox Code Playgroud)

您还可以从构建的工作日频率系列开始(和/或添加自定义工作日,如果您想要假期,0.14.0 中的新功能,请参见此处