我的数据未正确覆盖在网格上
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 轴上。您可以使用DayLocator
和HourLocator
(在文档here 中进行了描述,在this answer 中有进一步的解释)。
如果您将 DayLocator 和 HourLoactor 对象传递给函数 ax.xaxis.set_major_locator
和 ax.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()
【讨论】:
以上是关于我的数据未正确覆盖在网格上的主要内容,如果未能解决你的问题,请参考以下文章