2

我需要实施使用工作日的有条件休息。我有一堂课DateField,如果该日期在未来不到 5 个工作日,就会发生某些事情(动作a),否则b就会发生。如何确定两个对象之间的工作日数?

显然,我需要计算从今天开始的 5 个工作日。使用简单的时间增量查找未来 5 天很容易,但要考虑工作日,它会变得更加复杂。我想我现在可以放心地忽略假期(这不是最好的情况,但我认为我可以将工作日安排在周一至周五)。谁能给我一些指导,让我知道如何做类似的事情:target = today + 5 business_days

谢谢

4

2 回答 2

3

这是一个通用的解决方案,即使您的情况非常简单;P

from datetime import timedelta, date

def add_business_days(from_date, number_of_days):
    to_date = from_date
    while number_of_days:
       to_date += timedelta(1)
       if to_date.weekday() < 5: # i.e. is not saturday or sunday
           number_of_days -= 1
    return to_date

和结果。

>>> date.today()
datetime.date(2013, 7, 25)
>>> add_business_days(date.today(), 6)
datetime.date(2013, 8, 2)

如果您在 if 语句中检查日期是否为假期,则奖励标记。

于 2013-07-25T08:26:56.317 回答
0

此示例是当您将 django 项目作为 API 制作时

您可以 使用使用SCIPY的Numpy获得工作日(查看更多详细信息)您必须通过numpypip

蟒蛇 2.7

pip install numpy

蟒蛇 3

pip3 install numpy

根据models.py您要放置属性方法的位置添加:

class WorkingDay(models.Model):
    # YY-MM-DD
    start = models.DateField(null=True, verbose_name="start")
    end = models.DateField(null=True, verbose_name="end")
@property
def workdays(self):

    total = np.busday_count(self.start, self.end)

    return total

然后在你的serializers.py你可能有这样的东西。

class WorkingDaySerializer(serializers.ModelSerializer):

    workdays = serializers.IntegerField(read_only=True)

    class Meta:
        model = WorkingDay
        fields = '__all__'
        read_only_fields = ['workdays']

在您看来,您可能会做这样的事情。

class WorkingDayAPI(APIView):

    """
    {   "start":"2018-01-01",
        "end":"2018-05-01"
    }
    GET work days between dates 
    """

    serializer_class = WorkingDaySerializer

    def get(self, request, format=None):
        business_days = WorkingDay.objects.all()
        serializer = WorkingDaySerializer(business_days, many=True)
        return Response(serializer.data)

    def post(self, request, *args, **kwargs):
        start = request.data.get('start')
        end = request.data.get('end')

        # bizdays = request.data.get('bizdays')

        business_days = WorkingDay.objects.create(**request.data)
        business_days.start = start
        business_days.end = end
        business_days.workdays = workdays
        business_days.save()
        serializer = WorkingDaySerializer(business_days)
        return Response(serializer.data, status=status.HTTP_201_CREATED)
于 2018-04-26T07:03:09.240 回答