Правильно рассчитываемый день условно-досрочного освобождения с python - PullRequest
1 голос
/ 24 апреля 2020

Добрый вечер! Я юрист, и мне часто приходится подсчитывать, сколько времени до того, как осужденные смогут достигать таких льгот, как условно-досрочное освобождение.

Это работает так:

Во-первых, мне нужно получить немного основные переменные, такие как день, когда человек начал отбывать наказание (день, когда он был арестован). Это будет базовая дата для первой выгоды. Допустим, кто-то был арестован 12 ноября 2014 года.

base_date = datetime.date(day=12, month=11, year=2014)

Второе, что мне нужно сделать, это узнать, какой приговор был вынесен за каждое преступление (иногда человек осужден за более чем одно преступление и, за у каждого из них есть разные подсчеты в пользу. Допустим, этот человек был осужден за два преступления:

  • За первое преступление (которое является более серьезным преступлением) он был приговорен к 7 годы и 4 месяца в тюрьме.
  • За второе преступление он был приговорен к 4 годам, 10 месяцам и 20 дням тюремного заключения.

Для этого я использовал этот метод и вот где я думаю, что мой код не работает. Я считаю, что эти переменные должны быть в методе datetime или что-то в этом роде.

pena1_years, pena1_months, pena1_days = 7, 4, 0

pena2_years, pena2_months, pena2_days = 4, 10, 20

Теперь, когда первое преступление является более серьезным, ему нужно будет отслужить 2/5 этого предложения плюс 1/6 второго предложения, чтобы иметь возможность получить свое первое преимущество. Результат обоих должен быть добавлен к base_date, чтобы знать тогда он сможет достичь первой выгоды. Я превратил все в дни.

pena1_total = int(((pena1_years * 365) + (pena1_months * 30) + (pena1_days)) / 5 * 2)
datedifference1 = datetime.datetime.now() - datetime.timedelta(days=pena1_total)
pena1_total = relativedelta(datetime.datetime.now(), datedifference1)
print("Pena 1: " + str(pena1_total.years) + "a, " + str(pena1_total.months) + "m, " + str(pena1_total.days) + "d.")

(Печать вернула это: Pena 1: 2a, 11m, 4d.)

pena2_total = int(((pena2_years * 365) + (pena2_months * 30) + (pena2_days)) / 6)
datedifference2 = datetime.datetime.now() - datetime.timedelta(days=pena2_total)
pena2_total = relativedelta(datetime.datetime.now(), datedifference2)
print("Pena 2: " + str(pena2_total.years) + "a, " + str(pena2_total.months) + "m, " + str(pena2_total.days) + "d.")

(Печать вернула это: Pena 2: 0a, 9m , 21d.)

После вычисления фракций для каждого преступления, мне нужно было бы сложить оба и затем добавить к базовой дате. В этой ситуации этому парню придется отбыть 2 года, 11 месяцев и 5 дней за первое преступление и 9 месяцев и 23 дня за второе, в общей сложности за 3 года, 8 месяцев и 29 дней, прежде чем он сможет получить свое первое преимущество Тем не менее, я должен следовать этим правилам (так закон должен быть рассчитан):

  • Необходимо использовать обычный календарь (григорианский);
  • Сначала сложите годы (2014 + 3 года = 2017);
  • Затем сложите месяцы (июль 2018);
  • Затем сложите дни, но первый день, когда он начал служить, должен учитываться (9 август 2018). Важно, чтобы календарь использовался при суммировании дней, поскольку число дней в месяце (а также в зависимости от года) может варьироваться.

Вот как я это сделал, но я Я не получаю 9 августа 2018 года:

total = pena1_total + pena2_total
print("Total: " + str(total.years) + "a, " + str(total.months) + "m, " + str(total.days) + "d.")

(Печать вернула это: Всего: 3a, 8m, 25d.)

data_semiaberto = data_base + relativedelta(days=+total.days, months=+total.months, years=+total.years)
print("Data para o semiaberto: " + str(data_semiaberto))

(Печать вернула это: Data para o semiaberto : 2018-08-06)

Тогда датой первого пособия будет базовая дата его условно-досрочного освобождения. Ему нужно будет отбыть еще 2/5 оставшегося предложения за первое преступление и 1/6 за оставшееся предложение за второе преступление. Для этого мне нужно вычесть то, что он отбыл, из общего предложения за каждое преступление. Однако я застрял здесь.

Вот полный код:

import datetime
from dateutil.relativedelta import relativedelta

data_base = datetime.date(day=12, month=11, year=2014)
pena1_years, pena1_months, pena1_days = 7, 4, 0
pena2_years, pena2_months, pena2_days = 4, 10, 20

def calculadora():
    # Fraction of the first sentence
    pena1_total = int(((pena1_years * 365) + (pena1_months * 30) + (pena1_days)) / 5 * 2)
    datedifference1 = datetime.datetime.now() - datetime.timedelta(days=pena1_total)
    pena1_total = relativedelta(datetime.datetime.now(), datedifference1)
    print("Pena 1: " + str(pena1_total.years) + "a, " + str(pena1_total.months) + "m, " + str(pena1_total.days) + "d.")

    # Fraction of the second sentence
    pena2_total = int(((pena2_years * 365) + (pena2_months * 30) + (pena2_days)) / 6)
    datedifference2 = datetime.datetime.now() - datetime.timedelta(days=pena2_total)
    pena2_total = relativedelta(datetime.datetime.now(), datedifference2)
    print("Pena 2: " + str(pena2_total.years) + "a, " + str(pena2_total.months) + "m, " + str(pena2_total.days) + "d.")

    # Fraction total
    total = pena1_total + pena2_total
    print("Total: " + str(total.years) + "a, " + str(total.months) + "m, " + str(total.days) + "d.")


    # Date of the first benefit.
    data_semiaberto = data_base + relativedelta(days=+total.days, months=+total.months, years=+total.years)
    print("Data para o semiaberto: " + str(data_semiaberto))
calculadora()

Может кто-нибудь помочь мне, пожалуйста? Это сэкономит мне много времени во время работы.

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Так как я здесь, чтобы учиться, я подумал, что могу попробовать. Этот код все еще нуждается в некоторой работе, но я думаю, что это хорошее начало. Мои чувства не пострадают, если вы откажетесь от этого. Мы можем добавлять функции по мере необходимости, если вы хотите его использовать.

import datetime as dt
from dateutil.relativedelta import relativedelta as rdelta


class Sentence:

    release_date = None

    def __init__(self, year=1970, month=1, day=1):
        """Create a new instance with the date of the arrest,
        default is set to the unix epoch...hehehe"""
        self.year = year
        self.month = month
        self.day = day
        self.base_date = dt.date(self.year, self.month, self.day)
        self.arrest_date = dt.date(self.year, self.month, self.day)

    def basedate(self):
        """Returns the basedate/arrest date"""
        return self.arrest_date

    def penalty(self, years=0, months=0, days=0):
        """Each time the penalty method is call it accumulates
        the length of the sentence.  Returns release date."""
        self.years = years
        self.months = months
        self.days = days

        if Sentence.release_date is None:
            Sentence.release_date = (self.base_date +
                                     rdelta(years=self.years,
                                            months=self.months,
                                            days=self.days))
        else:
            Sentence.release_date = (Sentence.release_date +
                                     rdelta(years=self.years,
                                            months=self.months,
                                            days=self.days))

        return Sentence.release_date - rdelta(days=1)

    def remaining(self):
        """Returns a tuple of years, months, days remaining of the
        sentence"""
        self.y_remaining = rdelta(Sentence.release_date, dt.date.today()).years
        self.m_remaining = rdelta(Sentence.release_date,
                                  dt.date.today()).months
        self.d_remaining = rdelta(Sentence.release_date, dt.date.today()).days

        return self.y_remaining, self.m_remaining, self.d_remaining


s1 = Sentence(2014, 11, 12)
print(f'Arreset Date: {"":>31}{s1.basedate()}')
print(f'Release Date after 1st sentence: {"":>12}{s1.penalty(7, 4, 0)}')
print(f'Release Date after 2nd sentence: {"":>12}{s1.penalty(4, 10, 20)}')
# print(f'Release Date after 2nd sentence: {"":>12}{s1.penalty(1, 2, 5)}')
print(f'Time remaining on sentence as of {dt.date.today()}: '
      f'{s1.remaining()[0]} years, {s1.remaining()[1]} months, '
      f'{s1.remaining()[2]} days')

# Output
# Arreset Date:                                2014-11-12
# Release Date after 1st sentence:             2022-03-11
# Release Date after 2nd sentence:             2027-01-31
# Time remaining on sentence as of 2020-04-24: 6 years, 9 months, 8 days
1 голос
/ 24 апреля 2020

Проверьте приведенный ниже код, сначала рассчитывается количество дней, а затем вычитается количество дней для каждого пособия и печатается дата для следующей даты получения пособия.

Для учета високосных годов и количества дней в каждый месяц лучше рассчитать общее количество дней и построить на нем логи c.

В выходных данных будет напечатана информация о каждом пособии и, наконец, показано общее количество дней, проведенных вместе.

import datetime
from dateutil.relativedelta import relativedelta

data_base = datetime.date(day=12, month=11, year=2014)
pena1_years, pena1_months, pena1_days = 7, 4, 0
pena2_years, pena2_months, pena2_days = 4, 10, 20
total_days_spent = 0

def calculadora():
    # Calculate the end date and total number of days for the first crime
    pena1_end_date = data_base + relativedelta(years=+pena1_years, months=+pena1_months, days=+pena1_days)
    pena1_reamining_days = (pena1_end_date - data_base).days

    # Calculate the end date and total number of days for the second crime
    pena2_end_date = data_base + relativedelta(years=+pena2_years, months=+pena2_months, days=+pena2_days)
    pena2_reamining_days = (pena2_end_date - data_base).days

    benefit_count=1
    while pena1_reamining_days > 0 or pena2_reamining_days > 0:
        #count the minumum number of days for both the crimes
        pena1_minimum_days = round(pena1_reamining_days / 5 * 2)
        if pena1_minimum_days == 0 and pena1_reamining_days > 0:
            pena1_minimum_days = pena1_reamining_days
        pena1_reamining_days -= pena1_minimum_days
        print(f"Minimum no of days to spent in the first crime for the {benefit_count} benefit is {pena1_minimum_days} ")

        pena2_minimum_days = round(pena2_reamining_days / 6)
        if pena2_minimum_days == 0 and pena2_reamining_days > 0:
            pena2_minimum_days = pena2_reamining_days
        pena2_reamining_days -= pena2_minimum_days
        print(f"Minimum no of days to spent in the second crime for the {benefit_count} benefit is {pena2_minimum_days} ")

        total = pena1_minimum_days + pena2_minimum_days
        global total_days_spent
        total_days_spent += total
        print(f"Total no of days to spent for the {benefit_count} benefit {total} ")

        date_next_benefit = data_base + relativedelta(days=+total)
        print(f"{benefit_count} benefit day to avail after {date_next_benefit}")

        benefit_count+=1

calculadora()
print(f"Total number of days spent for both the crime is {total_days_spent}")

0 голосов
/ 25 апреля 2020

Прочитав ответ Рики и Сати sh, я нашел решение. Он возвращает правильные даты.

Все еще нужно завершить sh код для автоматизации любых обстоятельств.

Я не уверен, что смогу опубликовать GitHub здесь , Итак, вот код.

import datetime, math
from dateutil.relativedelta import relativedelta

# Método dias para anos, meses e dias.
def days_to_ymd(days):
    global days_to_ymd_result
    years = days // 365
    months = (days % 365) // 30
    days = (days % 365) % 30
    days_to_ymd_result = relativedelta(years=+years, months=+months, days=+days)
    return days_to_ymd_result

# Método anos, meses e dias para dias.
def ymd_to_days(years, months, days):
    global ymd_to_days_result
    ymd_to_days_result = (years * 365) + (months * 30) + days
    return ymd_to_days_result

# Método frações de dias.
def frac(days, frac):
    global frac_result
    frac_result = math.ceil(days * frac)
    return frac_result

# Data base.
data_base = datetime.date(day=12, month=11, year=2014)
print("Data base: " + data_base.strftime("%d/%m/%Y"))

# Informações sobre as penas.
pena1 = relativedelta(years=+7, months=+4, days=+0)
pena1_totaldays = ymd_to_days(years=pena1.years, months=pena1.months, days=pena1.days)
pena2 = relativedelta(years=+4, months=+10, days=+20)
pena2_totaldays = ymd_to_days(years=pena2.years, months=pena2.months, days=pena2.days)
pena_total = pena1 + pena2
pena_total_days = ymd_to_days(years=pena_total.years, months=pena_total.months, days=pena_total.days)
print("Pena 1: " + str(pena1.years) + "a, " + str(pena1.months) + "m, " + str(pena1.days) + "d (" + str(pena1_totaldays) + " dias).")
print("Pena 2: " + str(pena2.years) + "a, " + str(pena2.months) + "m, " + str(pena2.days) + "d (" + str(pena2_totaldays) + " dias).")
print("Pena total: " + str(pena_total.years) + "a, " + str(pena_total.months) + "m, " + str(pena_total.days) + "d (" + str(pena_total_days) + " dias).")

# Frações de pena.
pena1_frac = frac(days=pena1_totaldays, frac=2/5)
pena2_frac = frac(days=pena2_totaldays, frac=1/6)
frac_total_days = pena1_frac + pena2_frac - 72
frac_total = days_to_ymd(frac_total_days)
print("2/5 de " + str(pena1.years) + "a, " + str(pena1.months) + "m, " + str(pena1.days) + "d (" + str(pena1_totaldays) + " dias): " + str(days_to_ymd(pena1_frac).years) + "a, " + str(days_to_ymd(pena1_frac).months) + "m, " + str(days_to_ymd(pena1_frac).days) + "d (" + str(pena1_frac) + " dias).")
print("1/6 de " + str(pena2.years) + "a, " + str(pena2.months) + "m, " + str(pena2.days) + "d (" + str(pena2_totaldays) + " dias): " + str(days_to_ymd(pena2_frac).years) + "a, " + str(days_to_ymd(pena2_frac).months) + "m, " + str(days_to_ymd(pena2_frac).days) + "d (" + str(pena2_frac) + " dias).")
print("Total a ser cumprido: " + str(frac_total.years) + "a, " + str(frac_total.months) + "m, " + str(frac_total.days) + "d (" + str(frac_total_days) + " dias).")

# Semiaberto.
data_semiaberto = data_base + (relativedelta(years=+frac_total.years, months=+frac_total.months, days=+(frac_total.days - 1))) # -1 = Inclui o dia do começo (art. 10, CP).
print("Data prevista para o regime semiaberto: " + str(data_semiaberto.strftime("%d/%m/%Y")))

# Pena restante.
pena1_restante_days = pena1_totaldays - pena1_frac
pena2_restante_days = pena2_totaldays - pena2_frac
pena_restante_total_days = pena1_restante_days + pena2_restante_days
pena1_restante = days_to_ymd(pena1_restante_days)
pena2_restante = days_to_ymd(pena2_restante_days)
pena_restante = days_to_ymd(pena_restante_total_days)
print("Pena 1 restante: " + str(pena1_restante.years) + "a, " + str(pena1_restante.months) + "m, " + str(pena1_restante.days) + "d (" + str(pena1_restante_days) + " dias).")
print("Pena 2 restante: " + str(pena2_restante.years) + "a, " + str(pena2_restante.months) + "m, " + str(pena2_restante.days) + "d (" + str(pena2_restante_days) + " dias).")
print("Pena total restante: " + str(pena_restante.years) + "a, " + str(pena_restante.months) + "m, " + str(pena_restante.days) + "d (" + str(pena_restante_total_days) + " dias).")

# Frações da pena.
pena1_frac = frac(days=pena1_restante_days, frac=2/5)
pena2_frac = frac(days=pena2_restante_days, frac=1/6)
frac_total_days = (pena1_frac + pena2_frac)
frac_total = days_to_ymd(frac_total_days)
print("2/5 de " + str(pena1_restante.years) + "a, " + str(pena1_restante.months) + "m, " + str(pena1_restante.days) + "d (" + str(pena1_restante_days) + " dias): " + str(days_to_ymd(pena1_frac).years) + "a, " + str(days_to_ymd(pena1_frac).months) + "m, " + str(days_to_ymd(pena1_frac).days) + "d (" + str(pena1_frac) + " dias).")
print("1/6 de " + str(pena2_restante.years) + "a, " + str(pena2_restante.months) + "m, " + str(pena2_restante.days) + "d (" + str(pena2_restante_days) + " dias): " + str(days_to_ymd(pena2_frac).years) + "a, " + str(days_to_ymd(pena2_frac).months) + "m, " + str(days_to_ymd(pena2_frac).days) + "d (" + str(pena2_frac) + " dias).")
print("Total a ser cumprido: " + str(frac_total.years) + "a, " + str(frac_total.months) + "m, " + str(frac_total.days) + "d (" + str(frac_total_days) + " dias).")

# Aberto.
data_aberto = data_semiaberto + (relativedelta(years=+frac_total.years, months=+frac_total.months, days=+(frac_total.days - 1))) # -1 = Inclui o dia do começo (art. 10, CP).
print("Data prevista para o regime aberto: " + str(data_aberto.strftime("%d/%m/%Y")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...