我的数据未正确覆盖在网格上

Posted

技术标签:

【中文标题】我的数据未正确覆盖在网格上【英文标题】:My data is not overlaid on the grid correctly 【发布时间】:2022-01-16 12:48:20 【问题描述】:

我将很快从事一个包含大量数据的机器学习项目,因此我尝试模拟我将面临的挑战类型,以进行相应的准备。第一个是从 .cvs 中绘制日期时间(x 轴上的日期和 y 轴上的小时数)(使用 2021 年 4 月和 2020 年 4 月的此类数据):

我现在拥有的是 2021 年系列中的以下情节:

但我不明白为什么网格上的点不正确,例如,我在 2021 年 4 月的最新点应该是我在文件上的最后日期(即 07:37:56 30/ 04/2021):

但正如您在下图中看到的那样:

4 月的最后一个点在 y 刻度上比 08:00:00 更接近 07:00:00,并且位于 x 刻度的中间,如第 29 天和第 30 天的中间。这只是整个情节发生的事情的一个例子,我真的不知道为什么会发生。

我在 Google Colab 上的代码是这样的

#LIBRARIES AND PRE PROCESSING
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as pltd
import numpy as np
from datetime import datetime

caminho_dados = "/content/sample.csv"
df = pd.read_csv(caminho_dados,encoding='UTF-8',sep=',')

novo=df['ID;Hora;Data;;;'].str.split(';').str
df['ID']=novo[0]
df['Hora']=novo[1]
df['Data']=novo[2]

df.drop(columns=['ID;Hora;Data;;;'],inplace=True)

df['Data']=pd.to_datetime(df['Data'],format ='%d/%m/%Y')
df['Hora']=pd.to_datetime(df['Hora'],format ='%H:%M:%S')

#SEPARATING THE TWO APRILS I HAVE ON TWO DATAFRAMES, 2021 ONE & 2020 ONE
df_vinteum = df.iloc[:50, :]
df_vinte = df.iloc[50:, :]

#PLOTTING
fig, ax = plt.subplots()
ax.scatter(df_vinteum['Data'], df_vinteum['Hora'])

ax.xaxis.set_major_formatter(pltd.DateFormatter('%d'))
ax.yaxis.set_major_formatter(pltd.DateFormatter('%H'))

start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 1))

start, end = ax.get_ylim()
ax.yaxis.set_ticks(np.arange(start,end,(end-start)/24))

plt.title("Abril 2021")
plt.xlabel('Dias')
plt.ylabel('Horas')
plt.xticks(rotation=45)
plt.grid()

plt.rcParams["figure.figsize"] = (20,6)

plt.show()

【问题讨论】:

【参考方案1】:

发生这种情况是因为您采用了 matplotlib 生成的默认限制,但这些不一定会精确到每个小时的开始。我创建了一个较小的样本数据集来重新创建相同的问题:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as pltd

## create sample data
hora =  ['12:06:24','20:49:00','07:37:56']
dias = ['14/04/2021','15/04/2021','30/04/2021']

df = pd.DataFrame('Hora':hora, 'Data':dias)

请注意,如果我修改您的代码以在 y 轴上显示 minutes ax.yaxis.set_major_formatter(pltd.DateFormatter('%H:%M')),您会看到实际的 y 刻度并不完全在小时:

同样的问题也发生在 x 轴上。您可以使用DayLocatorHourLocator(在文档here 中进行了描述,在this answer 中有进一步的解释)。

如果您将 DayLocator 和 HourLoactor 对象传递给函数 ax.xaxis.set_major_locatorax.yaxis.set_major_locator,您可以更正散点图刻度线(完整代码如下):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as pltd

## create sample data
hora =  ['12:06:24','20:49:00','07:37:56']
dias = ['14/04/2021','15/04/2021','30/04/2021']

df = pd.DataFrame('Hora':hora, 'Data':dias)

df['Data']=pd.to_datetime(df['Data'],format ='%d/%m/%Y')
df['Hora']=pd.to_datetime(df['Hora'],format ='%H:%M:%S')

#PLOTTING
fig, ax = plt.subplots()
ax.scatter(df['Data'], df['Hora'])

ax.xaxis.set_major_formatter(pltd.DateFormatter('%d'))
ax.yaxis.set_major_formatter(pltd.DateFormatter('%H:%M'))

days = pltd.DayLocator(interval = 1)
ax.xaxis.set_major_locator(days)

hours = pltd.HourLocator(interval = 1)
ax.yaxis.set_major_locator(hours)

plt.title("Abril 2021")
plt.xlabel('Dias')
plt.ylabel('Horas')
plt.xticks(rotation=45)
plt.grid()

plt.rcParams["figure.figsize"] = (20,6)

plt.show()

【讨论】:

以上是关于我的数据未正确覆盖在网格上的主要内容,如果未能解决你的问题,请参考以下文章

InvalidOperationException 未处理 - 数据网格视图问题

剑道网格:未捕获的参考错误:未定义单位

引导网格未正确对齐

网格未正确连接到骨骼 Babylon.js

反应传单地图未正确显示

反应传单地图未正确显示