使用Python分析CSV时出现类型错误

2024-06-16 11:00:18 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次发布到这个网站,所以请让我知道如果我错过了什么或做错了什么

我正在写一个小程序来分析一些在工作中的使用数据(我在一个允许学生为私人用途预订教室的教育环境中工作)。 基本上,我想把一个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

奇怪的是,我在分析一个没有任何错误的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文件,如果你认为错误是在那里,但通过它看所有的行是在正确的格式和工作时,手动输入到函数抛出typeerror

任何建议/帮助都将不胜感激

谢谢你, 克里斯

编辑:抱歉忘记了回溯:

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')

Tags: csvtodatetimereturntimedefendday
1条回答
网友
1楼 · 发布于 2024-06-16 11:00:18
        starttime4 = str(starttime)
        endtime4 = str(endtime)
        return starttime, endtime

我想您应该返回starttime4,endtime4而不是starttime,endtime。因为starttime、endtime是datetime类型,所以当您将它们传递给函数timeelapsed时,会导致TypeError:必须是string,而不是datetime.datetime

相关问题 更多 >