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