使用matplotlib绘制时间:TypeError:需要一个整数

时间:2018-01-15 19:58:50

标签: python matplotlib time typeerror

G'morning all!

有人可以帮助我解决以下问题吗?提前谢谢!

我有一个CSV文件,其中包含时间戳(小时,分钟,秒,毫秒)和物体亮度(浮动),如下所示:

16,59,55,51 13.8
17,00,17,27 13.7
17,00,39,01 13.6
17,01,01,06 13.4

这是我的python脚本:

import matplotlib.pyplot as plt
import csv
from datetime import time

x = []
y = []

with open('calibrated.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=' ')
    for row in plots:
        x.append(time(row[0]))
        y.append(float(row[1]))

plt.plot(x,y, marker='o', label='brightness')
plt.gca().invert_yaxis()
plt.xlabel('time [UT]')
plt.ylabel('brightness [mag, CR]')
plt.legend()
plt.grid()
plt.show()

当我运行脚本时,我得到了这个TypeError:

Traceback (most recent call last):
  File "lightcurve.py", line 11, in 
    x.append(time(row[0]))
TypeError: an integer is required

我做错了什么?

3 个答案:

答案 0 :(得分:3)

发生错误的原因是您将字符串传递给需要整数的datetime.time()

如果我们查看row[0],结果将为"16,59,55,51"。因此,必须使用row[0].split(",")拆分此字符串,这将创建一个字符串列表。此列表的内容需要使用int()转换为整数,然后可以传递给datetime.time函数。

您的代码将变为:

x = []
y = []

with open('calibrated.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=' ')
    for row in plots:
        hours,minutes,seconds,milliseconds = [int(s) for s in row[0].split(",")]

        x.append(time(hours,minutes,seconds,milliseconds))
        y.append(float(row[1]))

plt.plot(x,y, marker='o', label='brightness')
plt.gca().invert_yaxis()
plt.xlabel('time [UT]')
plt.ylabel('brightness [mag, CR]')
plt.legend()
plt.grid()
plt.show()

给出了:

enter image description here

答案 1 :(得分:0)

你的行[0]是一串用逗号分隔的数字,例如" 16,59,55,51"

您需要将它们拆分为子字段,然后将每个较小的数字字符串转换为实际的整数,例如:

(hours, minutes, seconds, microseconds) = [int(v) for v in row[0].split(',')] x.append(time(hours, minutes, seconds, microseconds))

答案 2 :(得分:0)

在CSV文件中扫描时,行数据包含行[0]中的字符串。例如,csv文件的第一行变为:

row = ["16,59,55,51", "13.8"]

要解决此问题,您需要将这些字符串转换为适当的值。

 with open('calibrated.csv','r') as csvfile:
        plots = csv.reader(csvfile, delimiter=' ')
        for row in plots:
            t = [int(x) for x in row[0].split(',')]
            x.append(time(t[0],t[1],t[2],t[3]))
            y.append(float(row[1])

另一种选择是使用日期时间标记,如下所示:

from datetime import datetime
x = []
y = []

with open('calibrated.csv','r') as csvfile:
    plots = csv.reader(csvfile, delimiter=' ')
    for row in plots:
        x.append(datetime.strptime(row[0], '%H,%M,%S,%f'))
        y.append(float(row[1]))

这将使用你的毫秒作为微秒,但这对我来说似乎不是很重要。但是,如果需要,它允许您稍后添加日期。