我想找到一种方法,以1秒的频率为交易时间构建一个自定义的pandas.tseries.offsets类。这里的主要要求是时间偏移对象足够聪明,知道2015-06-18:16:00的下一秒将是“2015-061909:3000或09:30:01”,并且从这两个时间戳计算的时间增量正好是1s(自定义偏移1s),类似于工作日频率的BDay(1),而不是关闭时间的持续时间。
原因是,当在几个交易日内绘出Pd。级数为日内数据时,见下面的模拟例子,在收盘日和次日公开价格之间有大量的“阶跃线”(线性插值)来表示收盘时间的持续时间。有办法摆脱这个吗?我查看了pandas.tseries.offsets的源代码,发现pd.tseries.offsets.BusinessHourpd.tseries.offsets.BusinessMixin可能有帮助,但我不知道如何使用它们。

import pandas as pd
import numpy as np
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay

# set as 'constant' object shared by all codes in this script
BDAY_US = CustomBusinessDay(calender=USFederalHolidayCalendar())
sample_freq = '5min'
dates = pd.date_range(start='2015-01-01', end='2015-01-31', freq=BDAY_US).date
# exculde the 09:30:00 as it is included in the first time bucket
times = pd.date_range(start='09:30:00', end='16:00:00', freq=sample_freq).time[1:]
time_stamps = [dt.datetime.combine(date, time) for date in dates for time in times]
s = pd.Series(np.random.randn(len(time_stamps)).cumsum() + 100, index=time_stamps)

s.plot()

另一种我认为可以部分解决这个问题的方法是首先使用“cc>”来获得每行的默认连续整数索引,然后计算连续的整数索引在时间(以秒为单位)之间的差值。绘制整数索引作为X轴,然后将它们重命名为适当的时间标签。有人能教我如何使用reset_index()吗?
谢谢杰夫的评论。我只是检查一下在线文档中的matplotlib并发现它可能对我的情况有用。另一个后续问题:BusinessHour()是小时频率,有没有办法使其在1s频率?另外,如何将它与BusinessHour对象相结合?
使用CustomBusinessDay
from pandas.tseries.offsets import *
bhour = BusinessHour(start='09:30', end='16:00')
time = pd.Timestamp('2015-06-18 15:00:00')
print(time)
2015-06-18 15:00:00
# hourly increment works nicely
print(time + bhour * 1)
2015-06-19 09:30:00
# but not at minute or second frequency
print(time + Minute(61))
2015-06-18 16:01:00
print(time + Second(60*60 + 1))
2015-06-18 16:00:01

非常感谢,任何帮助都将不胜感激。

最佳答案

正如我在评论中提到的,你可能有两个不同的问题
您需要能够在没有长线性插值的情况下绘制业务时间的时间段。
您需要一个可以忽略非商业时间的DeTimeTimes算术(以秒为单位)的对象。
我已经给出了一个解决方案,将占1,因为这似乎是你的当务之急。如果您需要2个,或者两者都需要-请在评论中告诉我们:
一。用相邻的工作日绘制点
matplotlib中的大多数图都可以通过ticker API将索引格式化程序应用于轴。我会修改this example以适合你的情况。

import pandas as pd
import numpy as np
from pandas.tseries.holiday import USFederalHolidayCalendar
from pandas.tseries.offsets import CustomBusinessDay
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

# set as 'constant' object shared by all codes in this script
BDAY_US = CustomBusinessDay(calender=USFederalHolidayCalendar())
sample_freq = '5min'
dates = pd.date_range(start='2015-01-01', end='2015-01-31', freq=BDAY_US).date
# exculde the 09:30:00 as it is included in the first time bucket
times = pd.date_range(start='09:30:00', end='16:00:00', freq=sample_freq).time[1:]
time_stamps = [dt.datetime.combine(date, time) for date in dates for time in times]
s = pd.Series(np.random.randn(len(time_stamps)).cumsum() + 100, index=time_stamps)

data_length = len(s)
s.index.name = 'date_time_index'
s.name='stock_price'
s_new = s.reset_index()

ax = s_new.plot(y='stock_price') #plot the data against the new linearised index...

def format_date(x,pos=None):
    thisind = np.clip(int(x+0.5), 0, data_length-1)
    return s_new.date_time_index[thisind].strftime('%Y-%m-%d %H:%M:%S')

ax.xaxis.set_major_formatter(ticker.FuncFormatter(format_date))

fig = plt.gcf()
fig.autofmt_xdate()

plt.show()

这给出一个输出如下,首先在缩放自然规模,第二放大,所以你可以看到在星期五16:00和星期一09:00之间的过渡。

10-07 21:46