Python 从CSV文件添加时间/持续时间
我正在尝试从CSV文件中添加时间/持续时间值,但到目前为止我失败了。这是我正在尝试添加的示例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
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”
我们可以手动解析时间,但我们自己处理时间加法将是一个巨大的挑战