绘制某些包含日期和运行时间的列的图形

时间:2019-12-20 19:43:11

标签: python pandas date graph data-processing

我需要图形化数据文件(制表符分隔的.csv文件)的帮助,该文件包括许多列和行。

我只需要第1列和第10列即可绘制图形。第一列(索引0)用于保存日期的X轴,第十列(索引9)保存我试图为Y轴绘制的运行时间。

我读取日期值,以所需的方式对其进行形状和排序,然后在我打印时,它仅在每行上打印列名,并在所有行索引上打印0。我相信循环存在问题,但不确定如何解决。我尝试摆脱分配给每行索引的0,而仅将列名保留在第一行以引用这些列。

我还尝试绘制与运行时相对应的日期,但由于索引号被接受为参数,因此我的尝试失败。以下是我到目前为止尝试过的内容:

# Function to process the data files            
def file_processing (file_name):

    # reads the file using pandas and appends them in dict by rows' index numbers and times
    data_file=pandas.read_csv(file_name, sep="\t")
    for row in data_file.itertuples(index=False, name=False, ):
        datetime_obj = datetime.strptime(row[0],'%Y%m%dT%H%M%S')
        datetime_obj = datetime_obj.strftime("%Y-%m-%d %H:%M:%S")

        lst = [datetime_obj]
        lst2 = [row[9]]

        df = pandas.DataFrame(list(zip(lst,lst2)),columns = ['Dates','RunTime'])
        df.sort_values(by=['Dates'])
        print(df)
        #print(df)

        pandas.DataFrame.plot('Dates','Runtime',)

我的示例数据如下:

20190601T034207 NAME    cc130.aa.bb NAME-7600816.2005   1   1   NAME-37x161 37x161  d39c13  2821    0   0ce000  1283 JOBS/NAME-7600816.2005/blast-37-161.txt
20190601T034214 NAME    cc128.aa.bb NAME-7600816.2004   1   1   NAME-37x161 37x161  d39c13  2815    0   0ce000  1283 JOBS/NAME-7600816.2004/blast-37-161.txt
20190601T034208 NAME    nn019.aa.bb NAME-7600816.2008   1   1   NAME-37x161 37x161  d39c13  3465    0   0ce000  1283 JOBS/NAME-7600816.2008/blast-37-161.txt
20190601T034220 NAME    nn058.aa.bb NAME-7600816.2010   1   1   NAME-37x161 37x161  d39c13  3462    0   0ce000  1283 JOBS/NAME-7600816.2010/blast-37-161.txt
20190601T034217 NAME    nn011.aa.bb NAME-7600816.2014   1   1   NAME-37x161 37x161  d39c13  3469    0   0ce000  1283 JOBS/NAME-7600816.2014/blast-37-161.txt
20190601T034219 NAME    nn224.aa.bb NAME-7600816.2015   1   1   NAME-37x161 37x161  d39c13  3468    0   0ce000  1283 JOBS/NAME-7600816.2015/blast-37-161.txt

在注释掉图形代码后运行程序后得到的结果:

                 Dates  RunTime
0  2019-06-01 03:42:14     2815
                 Dates  RunTime
0  2019-06-01 03:42:08     3465
                 Dates  RunTime
0  2019-06-01 03:42:20     3462
                 Dates  RunTime
0  2019-06-01 03:42:17     3469
                 Dates  RunTime
0  2019-06-01 03:42:19     3468

请告诉我是否需要更新问题的任何部分而不降级。我真的很感激。我愿意接受任何建议。 非常感谢!

更新

@MaMaG发表评论后,我修复了代码并得到了有效的代码。现在,我试图将所有日期标签都放在X轴上。

工作代码

def file_processing (file_name):

    data_file = pandas.read_csv(file_name, delim_whitespace=True, header=None)
    data_file.rename(columns={0: 'date', 9:'run_time'}, inplace=True)
    data_file.sort_values(by='date',inplace=True)

    data_file['run_date'] = pandas.to_datetime(data_file.date, format='%Y%m%dT%H%M%S').dt.strftime("%Y-%m-%d %H:%M:%S")
    data_file.plot('run_date', 'run_time')
    plt.show()

当前图表

Current Graph

1 个答案:

答案 0 :(得分:0)

因此,首先要说的是,pandas数据框的巨大功能之一是您可以对一行中的所有行执行单个操作,而无需执行费时的for循环!

这里可能更接近您想要的:

data_file = pandas.read_csv('../stack_data.csv', delim_whitespace=True, header=None)
data_file['run_date'] = pandas.to_datetime(data_file[0], format='%Y%m%dT%H%M%S').dt.strftime("%Y-%m-%d %H:%M:%S")
data_file.rename(columns={9: 'run_time'}, inplace=True)
data_file.plot('run_date', 'run_time')
plt.show()

没有循环,一次不处理每一行。无需将每一行都视为元组或使用zip。 X轴日期可能彼此重叠,但是我敢肯定,如果您仔细阅读文档,将会找到一种倾斜它们的方法。祝你好运!