Python Plotly如何在K线图中去除日期时间间隙?

9
我正在尝试消除蜡烛图中的日期时间间隙(这些间隙是股市关闭时的时间段,因此没有数据)。似乎找不到使用plotly图形对象的好方法。是否有可行的方法来解决这个问题?

enter image description here

我的代码如下(使用plotly图形对象):
import dash
import dash_core_components as dcc
import dash_table
import pandas as pd
import dash_html_components as html
import numpy as np
from dash.dependencies import Output, Input, State
import plotly.graph_objects as go
import yfinance as yf
import plotly.express as px
from datetime import datetime, timedelta
from pytz import timezone
import dash_bootstrap_components as dbc

df= yf.Ticker('aapl')
df = df.history(interval="5m",period="5d")
df["Datetime"] = df.index

trace1 = {
    'x': df.Datetime,
    'open': df.Open,
    'close': df.Close,
    'high': df.High,
    'low': df.Low,
    'type': 'candlestick',
    'name': 'apple,
    'showlegend': False
    }

data = [trace1]

# Config graph layout
layout = go.Layout({
        'title': {
            'text': str(input_value) + ' Stock',
            'font': {
                'size': 15
            }
        },
        'plot_bgcolor': '#2E2E2E'
    })
fig = go.Figure(data=data, layout=layout)
fig.update_layout(xaxis_rangeslider_visible=False)

if __name__ == '__main__':
    app.run_server(debug=True)
4个回答

4
您可以设置rangebreaks选项:
  1. you must find missing values(holiday,weekend,closed days etc.)
    You can use this two lines code

  2. Place the fig.update before fig.show().

    alldays =set(df.Datetime[0]+timedelta(x) for x in range((df.Datetime[len(df.Datetime)-1]- df.Datetime[0]).days))
    missing=sorted(set(alldays)-set(df.Datetime))
    
    fig.update_xaxes(rangebreaks=[dict(values=missing)])
    

对我来说完美无缺!谢谢 - Felipe Cid

4
您可以通过plotly中的rangebreaks实现这一点。
以下是隐藏非交易时间和周末的代码。
    fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['Open'], high=df['High'], low=df['Low'], close=df['Close'])])
    fig.update_xaxes(
        rangeslider_visible=True,
        rangebreaks=[
            # NOTE: Below values are bound (not single values), ie. hide x to y
            dict(bounds=["sat", "mon"]),  # hide weekends, eg. hide sat to before mon
            dict(bounds=[16, 9.5], pattern="hour"),  # hide hours outside of 9.30am-4pm
            # dict(values=["2019-12-25", "2020-12-24"])  # hide holidays (Christmas and New Year's, etc)
        ]
    )
    fig.update_layout(
        title='Stock Analysis',
        yaxis_title=f'{symbol} Stock'
    )

    fig.show()

这里是Plotly文档,涉及到IT技术相关内容。

我在这里尝试了,但它没有起作用。https://dev59.com/Erj4oIgBc1ULPQZFLZIm - user17134848
哪些点没有起作用?我已经确认在我的环境中它是连续的。 - r-beginners

2

简述:我遇到了同样的问题,但在plotly文档中找不到解决方案。在plotly R社区中唯一的建议是将x轴设置为类别而不是日期时间。然而,由于fig.layout()没有此属性,我仍然无法使其正常工作。

对于您的代码,请将Datetime更改为字符串以将其强制转换为非日期时间类型轴。

df["Datetime"] = df.index.dt.strftime("%Y/%m/%d %H:%M")

这应该解决日期时间间隙的问题。


如果索引已经是日期时间格式,那么它就不需要 .dt。 - Chandan Gm

1
我们可以设置rangebreaks选项:
  1. 在存在间隙的地方填充nan(即重新索引数据帧);
  2. 为所有nan值创建datebreaks
  3. xaxes配置中设置范围中断值。
begin_date, end_date = [df.iloc[0].name, df.iloc[-1].name]
df = df.reindex(pd.date_range(begin_date, end_date, freq='D'))
datebreaks = df['Close'][df_plot['Close'].isnull()].index
fig.update_xaxes(rangebreaks=[dict(values=datebreaks)])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接