“传球”在(Python)日期响了

2024-04-19 12:54:21 发布

您现在位置:Python中文网/ 问答频道 /正文

更新以删除无关文本和歧义

规则:
每季度的第二天,员工累积8小时带薪休假。季度,特别是:

  • 1月1日-3月31日
  • 4月1日-6月30日
  • 7月1日-9月30日
  • 10月1日-12月31日

问题
使用python,我需要定义以下函数的核心:

def acrued_hours_between(start_date, end_date): 
    # stuff
    return integer

我目前正在使用Python,我想知道正确的方法是什么。

我假设使用DateTime对象,可能还有dateutil模块会有所帮助,但是我的大脑由于某种原因没有解决这个问题。在

更新
我认为计算有点简单,因为问题是:

"How many hours of Paid Time Off are accrued from start_date to end_date?" given the above "rules".

Tags: 函数文本核心date定义规则def员工
3条回答

这可以通过简单的旧整数数学实现:

from datetime import date

def hours_accrued(start, end):
    '''hours_accrued(date, date) -> int

    Answers the question "How many hours of Paid Time Off
      are accrued from X-date to Y-date?"

    >>> hours_accrued(date(2010, 4, 20), date(2012, 12, 21))
    80
    >>> hours_accrued(date(2010, 12, 21), date(2012, 4, 20))
    48
    '''
    return ( 4*(end.year - start.year)
        + ((end.month-1)/3 - (start.month-1)/3) ) * 8

我会按时间顺序对某个特定员工的所有事件进行排序,并按照该顺序模拟事件,以检查可用的带薪休假天数不会低于零。带薪休假请求是一个值为-(小时数)的事件。1月1日有一个价值+8小时的活动。在

每次修改数据时,从一开始就再次运行模拟。在

这种方法的优点是,它将检测到这样的情况:一个新的事件在当时是有效的,但会导致空闲天数减少,从而使以前有效的后来的事件现在变得无效。在

这可以通过将中间结果存储在缓存中进行优化,但由于每个员工可能只有几百个事件,所以不需要进行此优化。在

OP的编辑提到了真正的根本问题是:

"How many hours of Paid Time Off are accrued from X-date to Y-date?"

我同意,我会用最直接和直接的方式来计算,例如:

import datetime
import itertools

accrual_months_days = (1,1), (4,1), (7,1), (10,1)

def accruals(begin_date, end_date, hours_per=8):
  """Vacation accrued between begin_date and end_date included."""
  cur_year = begin_date.year - 1
  result = 0
  for m, d in itertools.cycle(accrual_months_days):
    if m == 1: cur_year += 1
    d = datetime.date(cur_year, m, d)
    if d < begin_date: continue
    if d > end_date: return result
    result += hours_per

if __name__ == '__main__':  # examples
  print accruals(datetime.date(2010, 1, 12), datetime.date(2010, 9, 20))
  print accruals(datetime.date(2010, 4, 20), datetime.date(2012, 12, 21))
  print accruals(datetime.date(2010, 12, 21), datetime.date(2012, 4, 20))

一个直接的公式当然会更快,但是如果没有错误的话,这个“通过检查纠正”的例子可以自动校准更快的公式,通过检查他们是否同意一个大样本的日期对(一定要包括在后面所有角落的情况,如第一天和最后一个季度)。在

相关问题 更多 >