Python 从Timeserie绘图中删除周六(但不包括周日或其他无数据时段)
我正在绘制一个财务时间序列(见下文,这里是1个月的数据) 我想删除我在红十字会等处显示的时段,即周六。请注意,这些时段并非都是没有数据的时段,而只是周六 我知道有一些关于如何消除差距的例子,例如:。 这不是我想要的,因为他们消除了所有的差距。(不是我的本意!) 我在想,接下来的方法可能是为xaxis创建一个自定义的值序列。由于天数是序数(即1天=1的值),因此可以创建一个序列,如1、2、3、4、5、6、8、9、10、11、12、13、15、16等。每七天跳过一次-跳过的那一天当然需要是星期六 跳过每个星期六,我可以想象如何使用timeutil中的rrule完成它。这是在这里完成的(见下文),因为每个星期一都有一条更强的垂直线。但是我该如何把它传递给蜱虫定位器呢?事实上,matplotlib API中有一个RRuleLocator类,但文档中没有说明如何使用它:。 欢迎提出任何建议 下面是我用于当前图表的代码:Python 从Timeserie绘图中删除周六(但不包括周日或其他无数据时段),python,matplotlib,Python,Matplotlib,我正在绘制一个财务时间序列(见下文,这里是1个月的数据) 我想删除我在红十字会等处显示的时段,即周六。请注意,这些时段并非都是没有数据的时段,而只是周六 我知道有一些关于如何消除差距的例子,例如:。 这不是我想要的,因为他们消除了所有的差距。(不是我的本意!) 我在想,接下来的方法可能是为xaxis创建一个自定义的值序列。由于天数是序数(即1天=1的值),因此可以创建一个序列,如1、2、3、4、5、6、8、9、10、11、12、13、15、16等。每七天跳过一次-跳过的那一天当然需要是星期六
fig, axes = plt.subplots(2, figsize=(20, 6))
quotes = price_data.as_matrix() # as matrix() to remove the columns header of the df
mpf.candlestick_ohlc(axes[0], quotes, width=0.01)
plt.bar(quotes[:,0] , quotes[:,5], width = 0.01)
for i , axes[i] in enumerate(axes):
axes[i].xaxis.set_major_locator(mdates.DayLocator(interval=1) )
axes[i].xaxis.set_major_formatter(mdates.DateFormatter('%a, %b %d'))
axes[i].grid(True)
# show night times with a grey shade
majors=axes[i].xaxis.get_majorticklocs()
chart_start, chart_end = (axes[i].xaxis.get_view_interval()[0],
axes[i].xaxis.get_view_interval()[1])
for major in majors:
axes[i].axvspan(max (chart_start, major-(0.3333)),
min(chart_end, major+(0.3333)),color="0.95", zorder=-1 ) #0.33 corresponds to 1/3 of a day i.e. 8h
# show mondays with a line
mondays = list(rrule(WEEKLY, byweekday=MO, dtstart= mdates.num2date(chart_start),
until=mdates.num2date(chart_end)))
for j, monday in enumerate(mondays):
axes[i].axvline(mdates.date2num(mondays[j]), linewidth=0.75, color='k', zorder=1)
如果您的日期是
datetime
对象,或者是pandas
数据框中的DateTimeIndex
,则可以检查某个日期使用的是.weekday
。然后您只需将周六的数据设置为nan
。请参见下面的示例
代码
结果
OP希望“删除我用红十字显示的句点”。你的阴谋仍然存在。这是正确的。我还不知道如何解决这个问题。
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import random
import datetime
import numpy as np
# generate some data with a datetime index
x = 400
data = pd.DataFrame([
random.random() for i in range(x)],
index=[datetime.datetime(2018, 1, 1, 0)
+ datetime.timedelta(hours=i) for i in range(x)])
# Set all data on a Saturday (5) to nan, so it doesn't show in the graph
data[data.index.weekday == 5] = np.nan
# Plot the data
fig, ax = plt.subplots(figsize=(12, 2.5))
ax.plot(data)
# Set a major tick on each weekday
days = mdates.DayLocator()
daysFmt = mdates.DateFormatter('%a')
ax.xaxis.set_major_locator(days)
ax.xaxis.set_major_formatter(daysFmt)