微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

计算日期范围之间的金额

如何解决计算日期范围之间的金额

所以我有这个问题,我想计算一个月的第一天和最后一天之间的金额。

示例: 我将收到一份 1000 美元的工作,这份工作将需要 3 个月,但我想减去我每个月将收到的金额,假设我每周工作 5 天,每天工作 8 次。

def get_montly_adjustments(self,start_date,end_date,project_id):
        # calculating the month first day and last day
        month_range = monthrange(year,month)
        first_day_month_str = "%s-%s-01" % (year,month)
        last_day_month_str = "%s-%s-01" % (year,month,month_range[1])
        month_first_day = datetime.strptime(first_day_month_str,"%Y-%m-%d")
        month_last_day = datetime.strptime(last_day_month_str,"%Y-%m-%d")

我创建了一个函数来计算当月的第一天和最后一天,但我想知道如何计算金额?

谢谢!

解决方法

首先,我们不要将日期转换为字符串并将其解析回来。我们可以做得更好:

def get_montly_adjustments(self,start_date,end_date,project_id):
    first_of_month = date(start_date.year,start_date.month,1)
    last_of_month = date(start_date.year,start_date.month + 1,1) + timedelta(-1)

假设工作日是周一到周五,我得到

    day = first_of_month
    workdays = 0
    while day <= last_of_month:
        if day.weekday() not in [5,6]:  # Saturday,Sunday
            workdays += 1
        day += timedelta(1)
    print(f"workdays: {workdays}")

我不清楚您希望如何获得报酬。这可能取决于国家和法律规定。一种方法如下

从 2021-06-09 开始,工作到 2021-09-08(3 个月)提供 4 次付款:

  • 6 月 9 至 30 日 = 22 天(= x 个工作日)
  • 7 月的 1 到 31 = 31 天(= x 个工作日)
  • 8 月的 1 到 31 = 31 天(= x 个工作日)
  • 9 月 1 到 8 = 8 天(= x 个工作日)

代码:

def get_montly_adjustments(self,project_id):
    # Calculate all workdays in project range
    day = start_date
    last_of_month = date(day.year,day.month + 1,1) + timedelta(-1)
    workdays = 0
    workdayspermonth = []
    while day <= end_date:
        if day.weekday() not in [5,6]:
            workdays += 1

        if day == last_of_month or day == end_date:
            workdayspermonth.append(workdays)
            workdays = 0
            last_of_month = date(day.year,day.month + 2,1) + timedelta(-1)  # next last of month
        day += timedelta(1)

    # Get to the money
    monthnames = {1: "Jan",2: "Feb",3: "Mar",4: "Apr",5: "May",6: "Jun",7: "Jul",8: "Aug",9: "Sep",10: "Oct",11: "Nov",12: "Dec"}
    totalworkdays = sum(workdayspermonth)
    print(f"Total workdays: {totalworkdays}")
    moneyperday = 1000 / totalworkdays
    print(f"That's an awesome {moneyperday:.2f} USD per day")
    for month in range(len(workdayspermonth)):
        workdays = workdayspermonth[month]
        print(f"Get paid! {workdays * moneyperday:.2f} USD for {workdays} workdays in {monthnames[start_date.month + month]}")

输出

get_montly_adjustments(None,date(2021,6,9),9,815)

Total workdays: 67
That's an awesome 14.93 USD per day
Get paid! 238.81 USD for 16 workdays in Jun
Get paid! 328.36 USD for 22 workdays in Jul
Get paid! 328.36 USD for 22 workdays in Aug
Get paid! 104.48 USD for 7 workdays in Sep
,

我将使用 Pandas 日期范围,但也许有人可以针对日期时间修改它。

创建月份范围内的天数:

days = pd.date_range("01/01/2021","03/01/2021",freq="D")

说明你工作的日子:

working_days = ["Mon","Tue","Wed","Thu","Fri"]

找出您在那个月工作的天数:

worked_days = days[days.strftime('%a').isin(days_worked)]

将工作天数乘以您每天的价格:

cost = len(worked_days)*8*price_per_hour

您可能需要考虑银行假期、休息日等。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。