Python 从CSV文件添加时间/持续时间

Python 从CSV文件添加时间/持续时间,python,python-2.7,csv,datetime,Python,Python 2.7,Csv,Datetime,我正在尝试从CSV文件中添加时间/持续时间值,但到目前为止我失败了。这是我正在尝试添加的示例csv 有可能得到这个输出吗 输出: 我一直试图计算日期时间,但总是失败: finput = open("./Test.csv", "r") while 1: line = finput.readline() if not line: break else: user = line.split(delim)[0] direction = line.split(del

我正在尝试从CSV文件中添加时间/持续时间值,但到目前为止我失败了。这是我正在尝试添加的示例csv

有可能得到这个输出吗

输出:

我一直试图计算日期时间,但总是失败:

finput = open("./Test.csv", "r")
while 1:
  line = finput.readline()
  if not line:
    break
  else:
    user = line.split(delim)[0]
    direction = line.split(delim)[1]
    duration = line.split(delim)[2]

    durationz = 0:00:00
    for k in duration:
      durationz += k
此外:
是否有特定的方式来声明时间值

有几件事你可以解决

首先,通过对文件中的行执行
,可以读取文件中的每一行

不能将变量durationz声明为0:00:00。它在python中根本不起作用

您可以做的一件事是将durationz设置为0,并通过将时间转换为秒数来解析时间。一些伪代码:

split duration string by ":"
add 60 * 60 * hours to duration
add 60 * minutes to duration
add seconds to duration

有几件事你可以解决

首先,通过对文件中的行执行
,可以读取文件中的每一行

不能将变量durationz声明为0:00:00。它在python中根本不起作用

您可以做的一件事是将durationz设置为0,并通过将时间转换为秒数来解析时间。一些伪代码:

split duration string by ":"
add 60 * 60 * hours to duration
add 60 * minutes to duration
add seconds to duration

有几件事你可以解决

首先,通过对文件中的行执行
,可以读取文件中的每一行

不能将变量durationz声明为0:00:00。它在python中根本不起作用

您可以做的一件事是将durationz设置为0,并通过将时间转换为秒数来解析时间。一些伪代码:

split duration string by ":"
add 60 * 60 * hours to duration
add 60 * minutes to duration
add seconds to duration

有几件事你可以解决

首先,通过对文件中的行执行
,可以读取文件中的每一行

不能将变量durationz声明为0:00:00。它在python中根本不起作用

您可以做的一件事是将durationz设置为0,并通过将时间转换为秒数来解析时间。一些伪代码:

split duration string by ":"
add 60 * 60 * hours to duration
add 60 * minutes to duration
add seconds to duration

使用
datetime.timedelta()
对象对持续时间进行建模,并以秒、分钟和小时的形式传入3个组件

使用;在这里重新发明字符分隔值解析轮毫无意义

使用字典跟踪每个用户的输入和输出值;使用将更容易添加新用户:

from collections import defaultdict
from datetime import timedelta
import csv

durations = defaultdict(lambda: {'In': timedelta(), 'Out': timedelta()})

with open("./Test.csv", "rb") as inf:
    reader = csv.reader(inf, delimiter=delim)
    for name, direction, duration in reader:
        hours, minutes, seconds = map(int, duration.split(':'))
        duration = timedelta(hours=hours, minutes=minutes, seconds=seconds)
        durations[name][direction] += duration

for name, directions in durations.items():
    print '{:10} In    {}'.format(name, directions['In'])
    print '           Out   {}'.format(directions['Out'])
    print '           Total {}'.format(
        directions['In'] + directions['Out'])
timedelta()
对象转换回字符串时(例如使用
str.format()
打印或格式化时),将再次转换为
h:mm:ss
格式

演示:


使用
datetime.timedelta()
对象对持续时间进行建模,并以秒、分钟和小时的形式传入3个组件

使用解析文件;这里没有必要重新发明字符分隔值解析轮

使用字典跟踪每个用户的输入和输出值;使用字典将更容易添加新用户:

from collections import defaultdict
from datetime import timedelta
import csv

durations = defaultdict(lambda: {'In': timedelta(), 'Out': timedelta()})

with open("./Test.csv", "rb") as inf:
    reader = csv.reader(inf, delimiter=delim)
    for name, direction, duration in reader:
        hours, minutes, seconds = map(int, duration.split(':'))
        duration = timedelta(hours=hours, minutes=minutes, seconds=seconds)
        durations[name][direction] += duration

for name, directions in durations.items():
    print '{:10} In    {}'.format(name, directions['In'])
    print '           Out   {}'.format(directions['Out'])
    print '           Total {}'.format(
        directions['In'] + directions['Out'])
timedelta()
对象转换回字符串时(例如使用
str.format()
打印或格式化时),将再次转换为
h:mm:ss
格式

演示:


使用
datetime.timedelta()
对象对持续时间进行建模,并以秒、分钟和小时的形式传入3个组件

使用解析文件;这里没有必要重新发明字符分隔值解析轮

使用字典跟踪每个用户的输入和输出值;使用字典将更容易添加新用户:

from collections import defaultdict
from datetime import timedelta
import csv

durations = defaultdict(lambda: {'In': timedelta(), 'Out': timedelta()})

with open("./Test.csv", "rb") as inf:
    reader = csv.reader(inf, delimiter=delim)
    for name, direction, duration in reader:
        hours, minutes, seconds = map(int, duration.split(':'))
        duration = timedelta(hours=hours, minutes=minutes, seconds=seconds)
        durations[name][direction] += duration

for name, directions in durations.items():
    print '{:10} In    {}'.format(name, directions['In'])
    print '           Out   {}'.format(directions['Out'])
    print '           Total {}'.format(
        directions['In'] + directions['Out'])
timedelta()
对象转换回字符串时(例如使用
str.format()
打印或格式化时),将再次转换为
h:mm:ss
格式

演示:


使用
datetime.timedelta()
对象对持续时间进行建模,并以秒、分钟和小时的形式传入3个组件

使用解析文件;这里没有必要重新发明字符分隔值解析轮

使用字典跟踪每个用户的输入和输出值;使用字典将更容易添加新用户:

from collections import defaultdict
from datetime import timedelta
import csv

durations = defaultdict(lambda: {'In': timedelta(), 'Out': timedelta()})

with open("./Test.csv", "rb") as inf:
    reader = csv.reader(inf, delimiter=delim)
    for name, direction, duration in reader:
        hours, minutes, seconds = map(int, duration.split(':'))
        duration = timedelta(hours=hours, minutes=minutes, seconds=seconds)
        durations[name][direction] += duration

for name, directions in durations.items():
    print '{:10} In    {}'.format(name, directions['In'])
    print '           Out   {}'.format(directions['Out'])
    print '           Total {}'.format(
        directions['In'] + directions['Out'])
timedelta()
对象转换回字符串时(例如使用
str.format()
打印或格式化时),将再次转换为
h:mm:ss
格式

演示:


首先,您可能会发现python内置的csv模块很有帮助。您不必手动拆分行并分配数据,只需执行以下操作:

import csv
with open("test.csv", mode="r") as f:
    reader = csv.reader(f)
    for row in reader:
        user, direction, duration = row  # this is equivalent to your own variable assignment code, 
                                         # using a cool feature of python called tuple unpacking
output = []
for user, time_dict in user_dict.items():
    total = time_dict["in"] + time_dict["out"]
    output.append([user, time_dict["in"], time_dict["out"], total])

with open("output.csv", mode="w") as f:
    writer = csv.writer(f)
    writer.writerows(output)
字典将是按用户对数据进行分组的一种很好的方式。下面是它的外观:

...
user_dict = {}
for row in reader:
    user, direction, duration = row
    user_dict[user] = user_dict.get(user, default={"in": "0:00:00", "out": "0:00:00"})
    user_dict[user][direction] = duration
在整个输入csv中运行后,您应该有一个字典,其中包含每个用户的条目,每个用户条目都包含各自的“in”和“out”值。如果csv中缺少in或out值,则已使用dictionary.get()语句的“default”参数将其设置为“0:00:00”

我们可以手动解析时间,但我们自己处理时间加法将是一个巨大的难题。幸运的是,python有一个处理时间的内置模块,称为datetime

import csv
import datetime

user_dict = {}
with open("test.csv", mode="r") as f:
    reader = csv.reader(f)
    for row in reader:
        user, direction, duration = row
        hour, minute, second = duration.split(":")

        # since the split left us with strings, and datetime needs integers, we'll need to cast everything to an int.
        hour = int(hour)
        minute = int(minute)
        second = int(second)

        # (we could have done the above more concisely using a list comprehension, which would look like this:
        # hour, minute, second = [int(time) for time in duration.split(":")]

        # to add time values we'll use the timedelta function in datetime, which takes days then seconds as its arguments. 
        # We'll just use seconds, so we'll need to convert the hours and minutes first.
        seconds = second + minute*60 + hour*60*60

        duration = datetime.timedelta(0, seconds)

        user_dict[user] = user_dict.get(user, default={"in": datetime.timedelta(0,0), "out": datetime.timedelta(0,0)})
        user_dict[user][direction] = duration
看看你的例子,我们只是把输入时间加上输出时间(虽然如果我们想要时钟上的总时间,我们想从输出时间中减去输入时间)。我们可以用以下方法做加法部分:

import csv
with open("test.csv", mode="r") as f:
    reader = csv.reader(f)
    for row in reader:
        user, direction, duration = row  # this is equivalent to your own variable assignment code, 
                                         # using a cool feature of python called tuple unpacking
output = []
for user, time_dict in user_dict.items():
    total = time_dict["in"] + time_dict["out"]
    output.append([user, time_dict["in"], time_dict["out"], total])

with open("output.csv", mode="w") as f:
    writer = csv.writer(f)
    writer.writerows(output)
这将使您接近您想要的内容,尽管每个用户的输出将是一行——数据将水平显示,而不是垂直显示

所有代码加在一起:

import csv
import datetime

user_dict = {}
with open("test.csv", mode="r") as f:
    reader = csv.reader(f)
    for row in reader:
        user, direction, duration = row
        hour, minute, second = [int(time) for time in duration.split(":")]
        seconds = second + minute*60 + hour*60*60
        duration = datetime.timedelta(0, seconds)

        user_dict[user] = user_dict.get(user, default={"in": datetime.timedelta(0,0), "out": datetime.timedelta(0,0)})
        user_dict[user][direction] = duration

output = []
for user, time_dict in user_dict.items():
    total = time_dict["in"] + time_dict["out"]
    output.append([user, time_dict["in"], time_dict["out"], total])

with open("output.csv", mode="w") as f:
    writer = csv.writer(f)
    header = ["name", "time in", "time out", "total time"]
    writer.writerow(header)
    writer.writerows(output)

首先,您可能会发现python内置的csv模块很有帮助。您不必手动拆分行并分配数据,只需执行以下操作:

import csv
with open("test.csv", mode="r") as f:
    reader = csv.reader(f)
    for row in reader:
        user, direction, duration = row  # this is equivalent to your own variable assignment code, 
                                         # using a cool feature of python called tuple unpacking
output = []
for user, time_dict in user_dict.items():
    total = time_dict["in"] + time_dict["out"]
    output.append([user, time_dict["in"], time_dict["out"], total])

with open("output.csv", mode="w") as f:
    writer = csv.writer(f)
    writer.writerows(output)
字典将是按用户对数据进行分组的一种很好的方式。下面是它的外观:

...
user_dict = {}
for row in reader:
    user, direction, duration = row
    user_dict[user] = user_dict.get(user, default={"in": "0:00:00", "out": "0:00:00"})
    user_dict[user][direction] = duration
在整个输入csv中运行后,您应该有一个字典,其中包含每个用户的条目,每个用户条目都包含各自的“in”和“out”值。如果csv中缺少in或out值,则已使用dictionary.get()语句的“default”参数将其设置为“0:00:00”

我们可以手动解析时间,但我们自己处理时间加法将是一个巨大的挑战