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
我做错了什么?
答案 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()
给出了:
答案 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]))
这将使用你的毫秒作为微秒,但这对我来说似乎不是很重要。但是,如果需要,它允许您稍后添加日期。