Python 使用数组绘制图形
我有一组数据,我想在图表中绘制。我有一个每小时分组的时间戳列表,然后我想在一个线形图中看到每小时的点数(在一天中,我有多天的数据,我想在一个每天的图形中) 我有每小时点数的值,还有它们发生的时间。我不能让它在我的图中画一条线,我想我缺少了一个简单的解决方案。我已经贴了一张图片,你也可以看到输出。要让线路显示出来,以下步骤是什么 我有以下代码:Python 使用数组绘制图形,python,pandas,datetime,matplotlib,Python,Pandas,Datetime,Matplotlib,我有一组数据,我想在图表中绘制。我有一个每小时分组的时间戳列表,然后我想在一个线形图中看到每小时的点数(在一天中,我有多天的数据,我想在一个每天的图形中) 我有每小时点数的值,还有它们发生的时间。我不能让它在我的图中画一条线,我想我缺少了一个简单的解决方案。我已经贴了一张图片,你也可以看到输出。要让线路显示出来,以下步骤是什么 我有以下代码: import pandas as pd import matplotlib.pyplot as plt import numpy as np import
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])
显示输出的图片
我的样本数据:
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
您没有以
matplotlib
可以理解其关系的方式准备x-y数据
简单的“答案”是绘制res
和df['HourOfDay'].值计数()
直接相对:
#.....
#range = (0,24)
#bins = 2
#plt.hist(df['DateTime'].dt.hour, bins, range)
plt.plot(res, df['HourOfDay'].value_counts())
plt.show()
但示例输出显示了问题:
matplotlib
不会为您排序x
-值(这会在不同的上下文中歪曲数据)。因此,在绘制之前,我们必须这样做:
#.....
#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()
现在,x
-值的顺序正确,y
-值已与它们一起在我们为此目的创建的组合xy
数组中排序:
显然,最好直接准备res
和df['HourOfDay'].value\u counts()
,这样我们就不必创建组合数组来对它们进行排序。因为您没有解释代码应该做什么,所以我们只能对代码创建的问题进行后期修复—您应该以不同的结构对其进行处理,以便在一开始就不会出现此问题。但是只有你能做到这一点(或者理解你代码意图的人——我不知道)
我还建议花些时间和有教育意义的人在一起——这段时间不是浪费的
更新似乎您试图为每天创建一个子地块,并计算每小时的条目数。我会这样做(但我相信,一些熊猫专家有更好的方法): 样本输出: 更新2
要将它们打印到单个图形中,可以修改回路:
#...
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()
其中一天的样本输出:
使用以下测试数据创建:
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
您是否有可能提供
test2.csv
文件或其中的一部分,以便我们可以更轻松地测试您的代码?简单地在此处复制整个代码很少能得到好的答案。我建议你读一读——在提炼问题的过程中,答案会变得更加明显。谢谢!我有多天的数据,我每天需要一个图表。test2文件是第一天+第二天的一部分。这给出了两张图,第一天一张,第二天一张。Test2文件只占整个文件的一小部分,它包含超过40天的时间,大约20k个点。我每天都需要一个图,这就是为什么它每天分组。你的代码帮助很大!我看到的唯一一件事是8点钟是前几天的,但在这张图中加了。我可以使用:for key,item in grouped_df:values=grouped_df.get_group(key)['HourOfDay'].value_counts()?感谢您的帮助!产生这些数据的原因是我们想分析从某台机器收集的数据。时间戳正在做一些事情,我们想看看它发生了多少次,什么时候发生。我用你的脚本分析数据,效果很好,但我有一个问题:我有50多天的时间,因为这个脚本把它放在一个子图中,所以图太小了,看不见。有没有办法每天制作一个以日期为标题的绘图?这样就可以从屏幕上阅读了。非常感谢!你为我节省了很多时间@T先生!我按照你的指示做了这个教程,非常有帮助。你知道我在哪里可以找到更高级的问题来训练吗?我还想知道是否可以在图表中设置一个简单的阈值。例如:绘图中一个月的所有线条,每天一行,所有不超过20行的线条都是绿色的,所有超过20行的线条都是红色的,每一行都有不同的图案。我在这里的建议(以及生活的其他方方面面):不要为了训练而训练,训练时要有真正的问题。我对Python的所有了解(不多)都来自于回答这么多问题,从其他人的回答中学习,以及阅读文档。所以,是的,你的真实世界的问题是结合情节不是很难-你可以做到这一点。如果你在实施过程中遇到了一个具体问题,可以问另一个问题——这里的人很乐意提供帮助。但请记住:这不是免费的编码服务。
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