Убрать пустое пространство c области графика Time Series с разрывами

В данных есть отсутствующие значения, хочу построить график без них, чтобы даты в эти периоды не отображались. пример графика с разрывом: введите сюда описание изображения

то, что хотелось бы получить: введите сюда описание изображения

Подготовка данных:

import pandas as pd
import numpy as np
import plotly.express as px

df = px.data.stocks()
df['date']=pd.to_datetime(df['date'])
df['GOOG']=np.where(
    (df['date']>pd.to_datetime('01.10.2018', dayfirst=True))&(df['date']<pd.to_datetime('01.04.2019',dayfirst=True)),
    np.nan, 
    df['GOOG'])

Убираю даты с отсутствующими значениями:

df2=df.dropna()

fig2 = px.line(df2, x='date', y="GOOG")

В итоге получаю: введите сюда описание изображения

Пробовал конвертацию даты в строковый тип данных - не помогает


Ответы (2 шт):

Автор решения: D.Vinogradov

Не понимаю, должен ли быть график соединен, потому что в условиях написано без отсутствующих значений.

Первый блок видимо оставляем как у вас:

import pandas as pd
import numpy as np
import plotly.express as px

df = px.data.stocks()
df['date']=pd.to_datetime(df['date'])
df['GOOG']=np.where(
    (df['date']>pd.to_datetime('01.10.2018', dayfirst=True))&(df['date']<pd.to_datetime('01.04.2019',dayfirst=True)),
    np.nan, 
    df['GOOG'])

Далее делаем дату строковым индексом и строим плот

df.index = df.date.astype(str)
df.dropna()['GOOG'].plot(rot=60)
plt.show()

введите сюда описание изображения

Как-то так.

UPD

df['date'] = df['date'].apply(lambda x: x.strftime("%Y/%m/%d"))

df2=df.dropna()

fig2 = px.line(df2, x='date', y="GOOG")

введите сюда описание изображения

→ Ссылка
Автор решения: CrazyElf

На английском SO есть ещё такой рецепт, основанный на указании rangebreaks:

dt_all = pd.date_range(start=df['date'].iloc[0],end=df['date'].iloc[-1])
dt_obs = [d.strftime("%Y-%m-%d") for d in pd.to_datetime(df2['date'])]

# define dates with missing values
dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d").tolist() if not d in dt_obs]

# hide dates with no values
fig2.update_xaxes(rangebreaks=[dict(values=dt_breaks)])

введите сюда описание изображения

→ Ссылка