使用数据文件计算员工的工资率

时间:2013-03-29 15:33:09

标签: python function file

简而言之,我正在制定一项计划,允许员工将时间卡打入时钟,并计算工作小时数和总工资率。如果员工工作超过8小时,他/她会加班,这是他们的工资率x 1.5。数据文件包含以下信息......

    John Doe
    8:30 A
    9:30 P
    4.00

第一行是员工的姓名,第二行是他们的开始时间,第三行是结束时间,第四行是工资率。 A表示AM,P表示PM。

我的问题是......如何让Python了解如何计算工作时间之间的差异?唯一的规则是员工不得在PM工作直到上午。

3 个答案:

答案 0 :(得分:2)

使用数学。

晚上9:30 = 9.5 + 12 = 21.5

21.5 - 8.5 = 13

我假设你已经完成了Python的一些工作。在12:59 PM之后的任何时间,您可以通过添加12来转换时间。这使得计算更容易一些。分钟部分,您可以通过除以60来改变分数。

答案 1 :(得分:0)

查看datetime模块,您可以在其中找到一些有用的对象,例如datetime.datetimedatetime.timedelta

您可以先将时间解析为datetime.datetime对象,然后采取差异来获取datetime.timedelta的实例。获得后,您可以提取所需信息。例如,您可以检查delta是否为负值以捕获无效工作时间(从PM到AM)。

快速代码示例:

import datetime

# Add 'M' to the string to get proper AM/PM
convert = lambda s: datetime.datetime.strptime(s+"M", "%I:%M %p")
start = convert("8:30 A")
end = convert("9:30 P")

print start
#>>> 1900-01-01 08:30:00

print end
#>>> 1900-01-01 21:30:00

print end - start
#>>> 13:00:00

print start - end
#>>> -1 day, 11:00:00

print type(end - start)
#>>> <type 'datetime.timedelta'>

答案 2 :(得分:0)

您没有强大的时间戳。将ISO format与日期,时间和时区或UTC时区一起使用。

如果某人从9:30 P开始并在第二天工作到8:30 A,该怎么办?如果你没有正确计算它们,他们的薪水就会变得非常脾气暴躁。

以下是该格式的解析器:

import datetime

file='''John Doe
8:30 A
9:30 P
4.00'''

def parse_time(s):
    print s
    if 'A' in s:
        t=datetime.datetime.strptime(s,'%I:%M A')
    elif 'P' in s:
        t=datetime.datetime.strptime(s,'%I:%M P')
        t=t+datetime.timedelta(0, 12*3600)

    return t      

file=file.splitlines()
name=file[0]
t0=parse_time(file[1])
t1=parse_time(file[2])
rate=float(file[3])
tot_seconds=(t1-t0).seconds
if tot_seconds > 8*3600:
    r1=8*3600*rate/3600
    r2=(tot_seconds-8*3600)*(rate*1.5/3600)
else:
    r1=tot_seconds*rate/3600
    r2=0    

print '${:.2f} base pay + ${:.2f} overtime for total of ${:.2f}'.format(r1,r2,r1+r2)

打印:

8:30 A
9:30 P
$32.00 base pay + $30.00 overtime for total of $62.00

但如上所述,你的时间戳不好。它们含糊不清,难以解析跨越一天边界的时期。