【发布时间】:2016-01-18 12:08:48
【问题描述】:
这是我第一次在这个网站上发帖,所以如果我遗漏了什么或做错了什么,请告诉我!
我正在编写一个小程序来分析工作中的一些使用数据(我在允许学生预订教室供私人使用的教育环境中工作)。 基本上,我想将教师预订和学生预订的 CSV 放入此脚本中,并计算出它们的使用量。
奇怪的是,我在特定函数上遇到了 TypeError -
def timeelapsed(time1, time2):
# Function to calculate time elapsed in booking
start_time = datetime.datetime.strptime(time1, '%Y-%m-%d %H:%M:%S')
end_time = datetime.datetime.strptime(time2, '%Y-%m-%d %H:%M:%S')
difference = end_time - start_time
return difference
奇怪的是,我在分析没有任何错误的 CSV 中途遇到了这个错误,当我运行调试器时,函数正在读取的数据很好(time1 = '2015-10 -08 14:30:00', time2 = '2015-10-08 15:30:00),所以我有点不明白为什么要这样做。
这是上下文中的代码(为混乱道歉,我仍在学习中)。
import datetime
import csv
def timeelapsed(time1, time2):
# Function to calculate time elapsed in booking
start_time = datetime.datetime.strptime(time1, '%Y-%m-%d %H:%M:%S')
end_time = datetime.datetime.strptime(time2, '%Y-%m-%d %H:%M:%S')
difference = end_time - start_time
return difference
"""
def start_test(time):
# Function to test whether session starts on the hour or on half hour (unused)
time_test = datetime.datetime.strptime(time, "%Y-%m-%d %H:%M:%S")
return time_test.minute
"""
"""
def close_test(end_time, next_time):
# Function to test whether a session starts close enough to the next session to be considered a single session (UNUSED)
gaptime = datetime.timedelta(hours=1)
end_time2 = datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
next_time2 = datetime.datetime.strptime(next_time, '%Y-%m-%d %H:%M:%S')
if next_time2 - end_time2 <= gaptime:
return "Yes"
else:
return "No"
"""
def day_of_year(time):
# Function to return day of year
day = datetime.datetime.strptime(time, '%Y.%m.%d')
day_year = day.timetuple().tm_yday
return day_year
def lessonexpand(time1, time2):
# Function to expand time slot if it falls on XX:00
starttime = datetime.datetime.strptime(time1, '%Y-%m-%d %H:%M:%S')
endtime = datetime.datetime.strptime(time2, '%Y-%m-%d %H:%M:%S')
if starttime.minute == 0:
newstarttime = starttime.replace(hour=(starttime.hour - 1), minute=30, second=0, microsecond=0)
if endtime.minute == 0:
newendtime = endtime.replace(minute=30, second=0, microsecond=0)
starttime1 = str(newstarttime)
endtime1 = str(newendtime)
return starttime1, endtime1,
else:
starttime2 = str(newstarttime)
endtime2 = str(endtime)
return starttime2, endtime2
else:
if endtime.minute == 0:
newendtime = endtime.replace(minute=30, second=0, microsecond=0)
starttime3 = str(starttime)
endtime3 = str(newendtime)
return starttime3, endtime3
else:
starttime4 = str(starttime)
endtime4 = str(endtime)
return starttime, endtime
# def day_add(tuple1, tuple2):
# while day_of_year(tuple1) == day_of_year(tuple2):
# length = timeelapsed(*lesson)+
f = open('celcattest2.csv')
csv_f = csv.reader(f)
t = open('celcattest3.csv', "w")
t.close()
for row in csv_f:
testrow1 = lessonexpand(row[0], row[1])
testrow2 = timeelapsed(*testrow1)
dayrow = day_of_year(row[2])
finalrow3 = str(testrow2), dayrow, row[3]
print finalrow3
"""with open("celcattest3.csv", "a") as w:
csv.writer(w).writerow(newrow3)
"""
如果您认为错误出在该文件中,我可以提供 CSV 文件,但仔细查看所有行的格式是否正确,并且在手动输入到引发类型错误的函数时可以正常工作。
任何建议/帮助将不胜感激!
谢谢, 克里斯
编辑:对于忘记回溯表示歉意:
Traceback (most recent call last):
File "C:/Python27/Time Calculator.py", line 75, in <module>
testrow2 = timeelapsed(*testrow1)
File "C:/Python27/Time Calculator.py", line 6, in timeelapsed
start_time = datetime.datetime.strptime(time1, '%Y-%m-%d %H:%M:%S')
TypeError: must be string, not datetime.datetime
还有之前的几个打印输出:
('2:00:00', 71, 'G05')
('2:00:00', 106, 'G05')
('2:00:00', 113, 'G05')
('2:00:00', 120, 'G05')
('2:00:00', 127, 'G05')
('2:00:00', 134, 'G05')
('2:00:00', 141, 'G05')
('2:00:00', 148, 'G05')
('2:00:00', 155, 'G05')
【问题讨论】:
-
你在某一时刻有
return starttime1, endtime1,,这似乎是错误的(额外的,)。 -
你写的那个函数似乎是正确的。您在哪一行遇到错误。你能在问题中发布它的回溯吗?
-
谢谢 J.J,我编辑了它,它仍然在做同样的事情。杰森 - 编辑!
-
尝试调试出现错误的
time1和time2值。 -
当前行是:
2015-10-08 14:30:00,2015-10-08 15:30:00,2015.10.08,G03手动将这些数字放入工作正常。