如何一起绘制 y 轴上的日期和时间

How to plot date and time in the y axis together

所以我有一个包含 3 列的数据框:'Data'、'Date'、'Time'。 我想在 x 轴上绘制 'Data',在 y 轴上绘制 'Date' 和 'Time',因为我每个日期值有 24 个时间值(每小时 1 个值) .但是,当我尝试在 x 轴上绘制 'Time' 时,我得到:

x = DF['Time']
y=DF['Data']
plt.plot(x,y)
plt.xlabel('Data')
plt.ylabel('NM data counts/hour')

TypeError: float() 参数必须是字符串或数字,而不是 'datetime.time'

另一方面,当我尝试在 x 轴上绘制 'Date' 时,我没有遇到任何问题,您可以在下面的 link 上看到该图。

x = DF['Date']
y=DF['Data']
plt.plot(x,y)
plt.xlabel('Data')
plt.ylabel('NM data counts/hour')

You can see the plot here

The data frame looks like this

问题是我每天有很多值,这就是为什么我想将 'Date' 和 'Time' 值绘制在一起,以绘制每个数据点及其相应的时间值.我希望我足够清楚 ):

顺便说一句,数据类型是这样的:

DF=NM_data.loc[First_GMS_2011]
DF.dtypes
Date    datetime64[ns]
Time            object
Data             int64
dtype: object

数据框如下所示:

           Date      Time    Data
0    2011-01-01  00:00:00  825361
1    2011-01-01  01:00:00  826873
2    2011-01-01  02:00:00  824004
3    2011-01-01  03:00:00  826001
4    2011-01-01  04:00:00  823890
...         ...       ...     ...
8721 2011-12-31  19:00:00  823309
8722 2011-12-31  20:00:00  821926
8723 2011-12-31  21:00:00  823056
8724 2011-12-31  22:00:00  823263
8725 2011-12-31  23:00:00  823552

此致!

您需要将 DateTime 列连接在一起并转换为 pd.datetime。在这个答案中,我还建议使用 .plot() 方法,因为它更容易,尤其是在处理像这样的时间序列数据时。

首先,连接:

您只能连接字符串列,因为 Time 列是 datetime.time 数据类型,您需要在连接之前使用 DF['Time'].astype(str) 将其转换为字符串。从你的图表看来,你的 Date 列是一个字符串,而不是 pd.datetime,这使它更容易(如果我在这里错了,将 .astype(str) 添加到 DF['Date'] 参考如下。要添加具有这些串联使用的新列:

(
    DF
    .assign(datetime = pd.to_datetime(DF['Date'] + ' ' + df['Time'].astype(str)))
)

其次,密谋

使用pandas可以使用.plot()方法。这意味着您不必导入 matplotlib 除非必要。 .plot() 将(默认情况下)绘制您的数据框,其中索引将成为您的 x 轴(我们将使用 .set_index('datetime')),而 y 轴将成为您的列(select 一列带有 ['Data']).

因此您可以创建一个新列 datetime 并使用以下绘图:

(
    DF
    .assign(datetime = pd.to_datetime(DF['Date'] + ' ' + DF['Time'].astype(str)))
    .set_index('datetime')
    ['Data']
    .plot()
)

您看到错误的原因是当您使用 plt.plot(x, y) 时,您的 x 不能是 datetime.time 数据类型的系列。如果您更改为 .set_index('Time'),它实际上可以使用 .plot() 方法工作,尽管这似乎从来都不是您想要的输出。