- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想找到一种方法,在交易时间内以 1 秒的频率构建自定义 pandas.tseries.offsets
类。这里的主要要求是时间偏移对象足够聪明,可以知道“2015-06-18 16:00:00”的下一秒是“2015-06-19 09:30:00 或 09:30”: 01',并且根据这两个时间戳计算的时间增量将恰好为 1s(自定义偏移量 1s,类似于工作日频率的 BDay(1)
)而不是关闭时间的持续时间。
原因是在绘制 pd.Series 的几个交易日的盘中数据时,请参见下面的模拟示例,收盘价和次日开盘价之间有很多“步进线”(线性插值)来表示关闭时间的持续时间。有没有办法摆脱这个?我查看了 pandas.tseries.offsets
的源代码并找到了 pd.tseries.offsets.BusinessHour
和 pd.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()
另一种我能想到的部分解决这个问题的方法是先reset_index()
获取每一行的默认连续整数索引,然后计算连续整数索引之间的差作为时间(以秒为单位)过去了。将整数索引绘制为 x 轴,然后将它们重新标记为适当的时间标签。有人可以告诉我如何使用 matplotlib
来做吗?
感谢杰夫的评论。我只是检查了 BusinessHour()
的联机文档,发现它对我的情况可能很有用。另一个后续问题: BusinessHour
是小时频率,有没有办法让它成为 1s 频率?另外,如何将它与 CustomBusinessDay
对象结合起来?
使用 BusinessHour()
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
非常感谢,如有任何帮助,我们将不胜感激。
最佳答案
正如我在评论中提到的,您可能有两个不同的问题
我给出了一个占 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 之间的过渡
关于python - 如何构建自定义 pandas.tseries.offsets 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946968/
我正在尝试在 R 上安装 tseries 包。我得到以下输出: > install.packages('tseries') Warning in install.packages("tseries")
我想创建一个圣诞节及其后一天的假期类,但遇到了问题。有三分之一的特殊情况我无法完全解决。 案例1:圣诞节是星期五,那么假期是星期五(12-25)和星期六(12-26)(已解决)。这个案例发生在2020
我正在尝试安装上面提到的软件包,但我无法安装。我已经遵循了几个提示,即使这样也无法安装上面的软件包。即使遵循以下已与某些软件包一起使用的命令,也无法安装: install.packages("fore
我有 pandas 对象: df_days DatetimeIndex(['2015-05-24', '2015-05-24', '2015-05-24',..., '2016-03-19',
我想转换以下 将对象键入 pandas DataFrame 对象 ( )。但是,我无法在 pandas 文档中找到相关功能来执行此操作。 数据采用以下形式: M3
我想找到一种方法,在交易时间内以 1 秒的频率构建自定义 pandas.tseries.offsets 类。这里的主要要求是时间偏移对象足够聪明,可以知道“2015-06-18 16:00:00”的下
我有一个普通的 df.index,我想增加几个小时。 In [1]: test[1].index Out[2]: [2010-03-11, ..., 2014-08-14] Length: 52,
尝试使用标签切片 Pandas 数据框时收到以下错误消息。 triggerDate = dat.loc[dat.Close 转换为时间戳,我们在Stack Overflow上找到一个类似的问题: h
我无法理解为什么在尝试使用 pandas 导入的 is_subperiod 函数时出现此错误 >>> import pandas as pd >>> pd.tseries.frequencies.is
我有一个 Pandas DataFrame,其中索引是(注意频率:H)- [2011-01-01 00:00:00, ..., 2013-12-31 23:00:00] Length: 26304,
我想从 datetime.timedelta 构建一个 Pandas pd.tseries.offsets In [1]: from pandas.tseries.frequencies import
考虑 DatetimeIndex tidx tidx = pd.to_datetime(['2016-07-29', '2016-08-31', '2016-09-30']) print(tidx.f
我正在使用 R 版本 3.4.0 我正在尝试在 linux 机器上安装 tseries 包: install.packages('https://cran.cnr.berkeley.edu/src/c
到目前为止,我有 EdChum 提供的以下代码: In [1]: df = pd.DataFrame({'a': [None] * 6, 'b': [2, 3, 10, 3, 5, 8]}) df["
我是一名优秀的程序员,十分优秀!