Tracer un graphique à l'aide de tableaux
J'ai un ensemble de données que je souhaite tracer dans un graphique. J'ai une liste d'horodatages que je veux regrouper par heure, puis je veux voir le nombre de points par heure dans un graphique linéaire (sur un jour, où j'ai des données de plusieurs jours, ce que je veux dans un graphique par jour ).
J'ai la valeur des points par heure et j'ai les heures sur lesquelles ils se produisent. Je ne fais pas fonctionner le fait qu'il donne une ligne dans mon graphique et je pense qu'il me manque une solution simple. J'ai également posté une photo pour que vous puissiez voir la sortie. Quelle est l'étape suivante à suivre pour afficher la ligne?
J'ai le code suivant:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import csv
from datetime import timedelta
import datetime as dt
data= pd.read_csv('test2.csv', header=0, index_col=None, parse_dates=True, sep=';', usecols=[0,1])
df=pd.DataFrame(data, columns=['Date', 'Time'])
df['DateTime'] = df['Date'] + df['Time']
#for date in df['DateTime']:
def RemoveMilliSeconds(x):
return x[:-5]
df['Time'] = df['Time'].apply(RemoveMilliSeconds)
df['DateTime'] = df['Date'] + df['Time']
df['DateTime'] = pd.to_datetime(df['DateTime'], format="%Y:%m:%d %H:%M:%S")
df['TimeDelta'] = df.groupby('Date')['DateTime'].apply(lambda x: x.diff())
#print(df['TimeDelta'] / np.timedelta64(1, 'h'))
df['HourOfDay'] = df['DateTime'].dt.hour
df['Day'] = df['DateTime'].dt.day
grouped_df = df.groupby('Day')
for key, item in grouped_df:
print(grouped_df.get_group(key)['HourOfDay'].value_counts(), "\n\n")
res=[]
for i in df['DateTime'].dt.hour:
if i not in res:
res.append(i)
print("enkele lijst:" + str(res))
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
x=np.array([res])
y=np.array([df['HourOfDay'].value_counts()])
plt.plot(x,y)
plt.show()
#times = pd.DatetimeIndex(df.Time)
#grouped = df.groupby([times.hour])
L'image qui montre la sortie

Mes exemples de données:
Date;Time
2020:02:13 ;12:39:02:913
2020:02:13 ;12:39:42:915
2020:02:13 ;13:06:20:718
2020:02:13 ;13:18:25:988
2020:02:13 ;13:34:02:835
2020:02:13 ;13:46:35:793
2020:02:13 ;13:59:10:659
2020:02:13 ;14:14:33:571
2020:02:13 ;14:25:36:381
2020:02:13 ;14:35:38:342
2020:02:13 ;14:46:04:006
2020:02:13 ;14:56:57:346
2020:02:13 ;15:07:39:752
2020:02:13 ;15:19:44:868
2020:02:13 ;15:32:31:438
2020:02:13 ;15:44:44:928
2020:02:13 ;15:56:54:453
2020:02:13 ;16:08:21:023
2020:02:13 ;16:19:17:620
2020:02:13 ;16:29:56:944
2020:02:13 ;16:40:11:132
2020:02:13 ;16:49:12:113
2020:02:13 ;16:57:26:652
2020:02:13 ;16:57:26:652
2020:02:13 ;17:04:22:092
2020:02:17 ;08:58:08:562
2020:02:17 ;08:58:42:545
Réponses
Vous n'avez pas préparé vos données xy de manière à matplotlib
comprendre leur relation.
La "réponse" facile serait de tracer res
et df['HourOfDay'].value_counts()
directement les uns contre les autres:
#.....
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
plt.plot(res, df['HourOfDay'].value_counts())
plt.show()
Mais l'exemple de sortie vous montre le problème:

matplotlib
ne commande pas les x
-valeurs pour vous (cela représenterait faussement les données dans un contexte différent). Donc, nous devons le faire avant de tracer:
#.....
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
xy=np.stack((res, df['HourOfDay'].value_counts()))
xy = xy[:, np.argsort(xy[0,:])]
plt.plot(*xy)
plt.show()
Maintenant, les x
-values sont dans le bon ordre, et les y
-values ont été triées avec elles dans le xy
tableau combiné que nous avons créé à cet effet:

De toute évidence, il vaudrait mieux se préparer res
et df['HourOfDay'].value_counts()
directement, afin de ne pas avoir à créer un tableau combiné pour les trier ensemble. Puisque vous n'avez pas fourni d'explication sur ce que votre code est censé faire, nous ne pouvons que post-corriger le problème créé par le code - vous devez le structurer différemment, afin que ce problème ne se produise pas en premier lieu. Mais vous seul pouvez le faire (ou les personnes qui comprennent l'intention de votre code - je ne le fais pas).
Je suggère également de passer du temps avec les didacticiels instructifs de matplotlib - ce temps n'est pas perdu.
Mise à jour
Il semble que vous essayez de créer une sous-parcelle pour chaque jour et de compter le nombre d'entrées par heure. Je l'aborderais comme ceci (mais je suis sûr que certains experts en panda ont de meilleurs moyens pour cela):
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#read your data and create datetime index
df= pd.read_csv('test1.txt', sep=";")
df.index = pd.to_datetime(df["Date"]+df["Time"].str[:-5], format="%Y:%m:%d %H:%M:%S")
#group by date and hour, count entries
dfcounts = df.groupby([df.index.date, df.index.hour]).size().reset_index()
dfcounts.columns = ["Date", "Hour", "Count"]
maxcount = dfcounts.Count.max()
#group by date for plotting
dfplot = dfcounts.groupby(dfcounts.Date)
#plot each day into its own subplot
fig, axs = plt.subplots(dfplot.ngroups, figsize=(6,8))
for i, groupdate in enumerate(dfplot.groups):
ax=axs[i]
#the marker is not really necessary but has been added in case there is just one entry per day
ax.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="blue", marker="o")
ax.set_title(str(groupdate))
ax.set_xlim(0, 24)
ax.set_ylim(0, maxcount * 1.1)
ax.xaxis.set_ticks(np.arange(0, 25, 2))
plt.tight_layout()
plt.show()
Exemple de sortie:

Mise à jour 2
Pour les tracer dans des figures individuelles, vous pouvez modifier la boucle:
#...
dfplot = dfcounts.groupby(dfcounts.Date)
for groupdate in dfplot.groups:
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 4))
fig.suptitle("Date:"+str(groupdate), fontsize=16)
#scaled for comparability among graphs
ax1.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="blue", marker="o")
ax1.set_xlim(0, 24)
ax1.xaxis.set_ticks(np.arange(0, 25, 2))
ax1.set_ylim(0, maxcount * 1.1)
ax1.set_title("comparable version")
#scaled to maximize visibility per day
ax2.plot(dfplot.get_group(groupdate).Hour, dfplot.get_group(groupdate).Count, color="red", marker="x")
ax2.set_xlim(0, 24)
ax2.xaxis.set_ticks(np.arange(0, 25, 2))
ax2.set_title("expanded version")
plt.tight_layout()
#save optionally
#plt.savefig("MyDataForDay"+str(groupdate)+".eps")
print("All figures generated")
plt.show()
Exemple de sortie pour l'un des jours:

créé avec les données de test suivantes:
Date;Time
2020:02:13 ;12:39:02:913
2020:02:13 ;12:39:42:915
2020:02:13 ;13:06:20:718
2020:02:13 ;13:18:25:988
2020:02:13 ;13:34:02:835
2020:02:13 ;13:46:35:793
2020:02:13 ;13:59:10:659
2020:02:13 ;14:14:33:571
2020:02:13 ;14:25:36:381
2020:02:13 ;14:35:38:342
2020:02:13 ;14:46:04:006
2020:02:13 ;14:56:57:346
2020:02:13 ;15:07:39:752
2020:02:13 ;15:19:44:868
2020:02:13 ;15:32:31:438
2020:02:13 ;15:44:44:928
2020:02:13 ;15:56:54:453
2020:02:13 ;16:08:21:023
2020:02:13 ;16:19:17:620
2020:02:13 ;16:29:56:944
2020:02:13 ;16:40:11:132
2020:02:13 ;16:49:12:113
2020:02:13 ;16:57:26:652
2020:02:13 ;16:57:26:652
2020:02:13 ;17:04:22:092
2020:02:17 ;08:58:08:562
2020:02:17 ;08:58:42:545
2020:02:17 ;15:19:44:868
2020:02:17 ;17:32:31:438
2020:02:17 ;17:44:44:928
2020:02:17 ;17:56:54:453
2020:02:17 ;18:08:21:023
2020:03:19 ;06:19:17:620
2020:03:19 ;06:29:56:944
2020:03:19 ;06:40:11:132
2020:03:19 ;14:49:12:113
2020:03:19 ;16:57:26:652
2020:03:19 ;16:57:26:652
2020:03:19 ;17:04:22:092
2020:03:19 ;18:58:08:562
2020:03:19 ;18:58:42:545