matplotlib 的日期时间问题

Ber*_*and 8 python matplotlib

我正在拉我的头发以显示带有 matplotlib 的系列。

我正在使用 python 2.7。我有一个带日期的熊猫数据框。我将日期转换为日期时间,但我试图显示一个图但没有成功。

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime, date

#I imported df before

type(df)
<class 'pandas.core.frame.DataFrame'>

# The dataframe
AnneeObs  MoisObs  JourObs  NbFluxEntrant
0        2019        8       19            763
1        2019        8        1           1098
...        ...      ...      ...            ...
655      2017       11        1            428
656      2017       11       13           1530

[657 rows x 4 columns]

# To convert dates to datetime
for i in range(0,len(df)):
     df.loc[i,"dateObs"] = date(year=df.iloc[i,0], month=df.iloc[i,1], 
day=df.iloc[i,2])

df['dateObs'] = pd.DatetimeIndex(df['dateObs'])

# To order by dates
df = df.sort_values("dateObs", ascending=True)

df2 = df[["dateObs", "NbFluxEntrant"]]

df2bis = df2.copy()
df2bis = df2bis.set_index('dateObs')

df2bis

# The new dataframe
            NbFluxEntrant
dateObs                  
2017-11-01            428
2017-11-02            931
...                   ...
2019-08-18            243
2019-08-19            763

[657 rows x 1 columns]

# Maybe it's too much...
df2bis.index = pd.to_datetime(df2bis.index)

type(df2bis.index)
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

# I tried to display it but...
df2bis.plot()
Run Code Online (Sandbox Code Playgroud)

但是,它不起作用:

无法执行第 1 行:df2bis.plot()
ValueError:视图限制最小值 0.0 小于 1,并且是无效的 Matplotlib 日期值。如果您将非日期时间值传递给具有日期时间单位的轴,则通常会发生这种情况

我尝试了其他代码,但没有什么好处:

df2bis.plot(x="dateObs", y="NbFluxEntrant")
df2bis.plot(x=df2bis.index.values, y="NbFluxEntrant")
Run Code Online (Sandbox Code Playgroud)

你有什么建议吗 ?

提前致谢

编辑:我尝试了另一个不起作用的代码:

import matplotlib

dates = matplotlib.dates.date2num(df2bis.index)
dates
Run Code Online (Sandbox Code Playgroud)

数组([736634., 736635.,..., 737289., 737290.])

matplotlib.pyplot.plot_date(dates, df2bis["NbFluxEntrant"])
Run Code Online (Sandbox Code Playgroud)

ValueError: view limit minimum 0.0 小于 1 并且是无效的 Matplotlib 日期值。如果您将非日期时间值传递给具有日期时间单位的轴,则通常会发生这种情况

嗯...

Dee*_*sha 9

我遇到了类似的问题。你可以试试这个:

df2bis.set_index('dateObs', inplace=True)
df2bis.index = pd.to_datetime(df2bis.index)
df2bis.plot()
Run Code Online (Sandbox Code Playgroud)


小智 9

尝试使用 plt.close() 清除之前的绘图设置。这解决了我的问题。


小智 0

由于我无法使用给定的代码重现错误,我只能猜测导致此问题的原因。最常见的一个将被修复如下:

错误的一个可能原因可能是 matplotlib 不喜欢 datetime64 数据类型。如果你更换:

df2bis.plot()
Run Code Online (Sandbox Code Playgroud)

plt.plot(df2bis.index.to_pydatetime(), df2bis.NbFluxEntrant)
Run Code Online (Sandbox Code Playgroud)

这应该得到解决。

另一个选项是 DataFrame 内的 NaN,因此在绘图之前删除所有 NaN

plt.plot(df2bis.index.to_pydatetime().dropna(), df2bis.NbFluxEntrant.dropna())
Run Code Online (Sandbox Code Playgroud)

另一个可能导致问题的点是默认格式出现问题。只需确保将格式添加到_datetime,否则它可能会更改日期和月份

df2bis.index = pd.to_datetime(df2bis.index, format="%Y-%m-%d")
Run Code Online (Sandbox Code Playgroud)