【问题标题】:Type Error when analysing CSV with Python使用 Python 分析 CSV 时输入错误
【发布时间】: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,我编辑了它,它仍然在做同样的事情。杰森 - 编辑!
  • 尝试调试出现错误的time1time2 值。
  • 当前行是:2015-10-08 14:30:00,2015-10-08 15:30:00,2015.10.08,G03 手动将这些数字放入工作正常。

标签: python csv datetime


【解决方案1】:
        starttime4 = str(starttime)
        endtime4 = str(endtime)
        return starttime, endtime

我认为您想返回 starttime4、endtime4 而不是 starttime、endtime。因为 starttime, endtime 是 datetime 类型,当你将它们传递给函数 timeelapsed 时会导致 TypeError: must be string, not datetime.datetime.

【讨论】:

  • 感谢您指出您和@j-j-hakala 之间似乎已经解决了这个错误。下次我会仔细检查我的代码。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 2015-11-16
  • 2016-01-11
  • 2018-05-02
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
相关资源
最近更新 更多