【问题标题】:Bi-monthly salary between interval of two dates两个日期间隔之间的双月工资
【发布时间】:2017-05-08 16:01:39
【问题描述】:

我正在尝试编写一个薪水计算器,它可以告诉您病假期间的薪水是多少。在我居住的哥斯达黎加,工资每两个月支付一次(每个月的 15 日和 30 日),每个病假都会支付 80% 的工资。因此,该程序会询问您的月薪是多少,然后询问您病假的开始日期和结束日期。最后,它的目的是打印出您在病假之间的每个发薪日的薪水。这是我目前所拥有的:

import datetime

salario = float(input("What is your monthly salary? "))

   fecha1 = datetime.strptime(input('Start date of sick leave m/d/y: '), '%m/%d/%Y')

fecha2 = datetime.strptime(input('End date of sick leave m/d/y: '), '%m/%d/%Y')


diasinc = ((fecha2 - fecha1).days)
print ("Number of days in sick leave: ")
print (diasinc)

def daterange(fecha1, fecha2):
    for n in range(int ((fecha2 - fecha1).days)):
        yield fecha1 + timedelta(n)

for single_date in daterange(fecha1, fecha2):
    print (single_date.strftime("%Y-%m-%d")) #This prints out each individual day between those dates.

我知道我只需将薪水乘以 0.8 即可得到 80%,但如何让程序在每个发薪日打印出来?

提前谢谢你。

【问题讨论】:

  • 如果 15 号或 30 号是周末怎么办?
  • 用户从相关期间的开始日期到结束日期的 for 循环;每次迭代都是一天,您可以打印每天的工资
  • @JoshuaSmith 我猜你也可以算作发薪日。
  • @HenryM 我一直在尝试使用 for 循环,但由于输入日期而出现错误。 "TypeError: 描述符 'date' 需要一个 'datetime.datetime' 对象,但收到了一个 'int'"
  • 第 15 和第 30 不是两周。这是每月 15 日和最后一天的双月付款。两周正好是两周的间隔。

标签: python


【解决方案1】:

这是大约八年前对类似问题的旧答案:python count days ignoring weekends ...

... 阅读Python: datetime 模块并调整 Dave Webb 的生成器表达式以计算每次日期为 15 日或 30 日。这是计算任意月份的number of occurrences of Friday on the 13th 的另一个示例。

使用模算术可以简化此计算,还有一些更好的方法。但是,除非您在功率较低的硬件上一次处理数百万个这些数据并且一次跨越数月的日期范围,否则它们无关紧要。甚至可能有一个模块可以更有效地为您执行此类操作。但是您可能很难验证(测试正确性)并且很难找到。

请注意,从长远来看可能更好的一种方法是使用Python: SQLite3,它应该包含在 Python 发行版的标准库中。使用它来生成范围广泛的所有日期的参考表(从您的组织成立到现在的一个世纪)。您可以在该表中添加一列以记录所有发薪日,并使用 SQL 查询该表并选择日期 WHERE payday==True AND date BETWEEN .... 等。

有一个SQLite: Get all dates between dates的例子。

这种方法将一些小的编码工作和一些存储空间投入到可以在可预见的未来有效使用的参考表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-06
    • 2012-10-28
    • 1970-01-01
    • 2019-03-28
    • 2011-01-01
    • 2011-06-06
    相关资源
    最近更新 更多