sourcetip

시간 델타를 년으로 변환하시겠습니까?

fileupload 2023. 6. 12. 21:50
반응형

시간 델타를 년으로 변환하시겠습니까?

저는 몇 년이 지났는지 확인해야 합니다.현재 나는 가지고 있습니다.timedeltadatetime모듈과 몇 년으로 변환하는 방법을 모릅니다.

은 a보다 더 많은 합니다.timedelta시작(또는 종료) 날짜를 알아야 합니다.(윤년제입니다.)

가장 좋은 방법은 다음을 사용하는 것입니다.dateutil.relativedelta 개체입니다. 하지만 타사 모듈입니다.만약 당신이 알고 싶다면.datetime은 것은그였습니다.n몇 년 후(기본값에서 지금까지) 다음 작업을 수행할 수 있습니다.

from dateutil.relativedelta import relativedelta

def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    return from_date - relativedelta(years=years)

표준 라이브러리를 고수하는 것이 좋다면 답은 조금 더 복잡합니다.:

from datetime import datetime
def yearsago(years, from_date=None):
    if from_date is None:
        from_date = datetime.now()
    try:
        return from_date.replace(year=from_date.year - years)
    except ValueError:
        # Must be 2/29!
        assert from_date.month == 2 and from_date.day == 29 # can be removed
        return from_date.replace(month=2, day=28,
                                 year=from_date.year-years)

에는 2이는 22/29를 합니다.이 3/1을 , 마지막 3/1을 하세요.return읽을 문::

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)

당신의 질문은 원래 몇 년이 지났는지 알고 싶다고 말했습니다. 365 수정년수원가연정간면하 365.2425일을을 할 수 .yearsago위에 정의된 함수:

def num_years(begin, end=None):
    if end is None:
        end = datetime.now()
    num_years = int((end - begin).days / 365.2425)
    if begin > yearsago(num_years, end):
        return num_years - 1
    else:
        return num_years

18세를 하세요.timedelta윤년 때문에 일부 에지 사례에서 올바르게 작동하지 않습니다.예를 들어, 2000년 1월 1일에 태어난 사람은 2018년 1월 1일(윤년 5개 포함)에 정확히 6575일 후에 18세가 되지만 2001년 1월 1일에 태어난 사람은 2019년 1월 1일(윤년 4개 포함)에 정확히 6574일 후에 18세가 됩니다.따라서, 만약 누군가가 정확히 6574일이라면, 여러분은 그들의 생일에 대한 조금 더 많은 정보를 알지 않고서는 그들이 17살인지 18살인지 결정할 수 없습니다.

올바른 방법은 날짜에서 직접 나이를 계산하여 2년을 뺀 다음 현재 월/일이 생년월일보다 앞에 있으면 1년을 빼는 것입니다.

먼저, 가장 세부적인 수준에서는 문제가 정확하게 해결될 수 없습니다.연도의 길이는 다양하며, 연도 길이에 대한 명확한 "올바른 선택"은 없습니다.

즉, "자연스러운" 단위(아마도 몇 초)의 차이를 얻고 해당 단위와 연도 간의 비율로 나눕니다.예.

delta_in_days / (365.25)
delta_in_seconds / (365.25*24*60*60)

...아니면 뭐든지.몇 년보다 훨씬 덜 명확하게 정의되어 있기 때문에 몇 달을 멀리하십시오.

다음은 인간이 하는 것과 같은 방식으로 생일을 계산하는 업데이트된 DOB 함수입니다.

import datetime
import locale


# Source: https://en.wikipedia.org/wiki/February_29
PRE = [
    'US',
    'TW',
]
POST = [
    'GB',
    'HK',
]


def get_country():
    code, _ = locale.getlocale()
    try:
        return code.split('_')[1]
    except IndexError:
        raise Exception('Country cannot be ascertained from locale.')


def get_leap_birthday(year):
    country = get_country()
    if country in PRE:
        return datetime.date(year, 2, 28)
    elif country in POST:
        return datetime.date(year, 3, 1)
    else:
        raise Exception('It is unknown whether your country treats leap year '
                      + 'birthdays as being on the 28th of February or '
                      + 'the 1st of March. Please consult your country\'s '
                      + 'legal code for in order to ascertain an answer.')
def age(dob):
    today = datetime.date.today()
    years = today.year - dob.year

    try:
        birthday = datetime.date(today.year, dob.month, dob.day)
    except ValueError as e:
        if dob.month == 2 and dob.day == 29:
            birthday = get_leap_birthday(today.year)
        else:
            raise e

    if today < birthday:
        years -= 1
    return years

print(age(datetime.date(1988, 2, 29)))

일 수를 얻은 다음 연도에 대해 365.2425(그레고리력 연도의 평균)로 나눕니다.달 동안 30.436875(그레고리력 월의 평균)로 나눕니다.

얼마나 정확해야 합니까? td.days / 365.25윤년이 걱정된다면 꽤 가까워질 겁니다

def age(dob):
    import datetime
    today = datetime.date.today()

    if today.month < dob.month or \
      (today.month == dob.month and today.day < dob.day):
        return today.year - dob.year - 1
    else:
        return today.year - dob.year

>>> import datetime
>>> datetime.date.today()
datetime.date(2009, 12, 1)
>>> age(datetime.date(2008, 11, 30))
1
>>> age(datetime.date(2008, 12, 1))
1
>>> age(datetime.date(2008, 12, 2))
0

간단한 해결책!

import datetime as dt
from dateutil.relativedelta import relativedelta

dt1 = dt.datetime(1990,2,1)
dt2 = dt.datetime(2021,5,16)
out = relativedelta(dt2, dt1)

print(f'Complete: {out}')
print(f'years:{out.years}, months:{out.months}, days:{out.days}') `

완료: 상대 델타(년=+31, 월=+3, 일=+15)

년:31, 월:3, 일:15

파티에 늦었지만, 이것은 당신에게 정확하고 쉽게 나이를 줄 것입니다.

b = birthday
today = datetime.datetime.today()
age = today.year - b.year + (today.month - b.month > 0 or 
                             (today.month == b.month > 0 and 
                              today.day - b.day > 0))

이 메서드는 datetime 라이브러리의 해킹입니다.

def calculate_age(birthday_date, fmt="%Y-%m-%d"):
    birthday = datetime.datetime.strptime(birthday_date, fmt)
    age = datetime.datetime.now() - birthday
    # first datime valid is (1, 1, 1), I use (1, 12, 31) => (2, 0, 0) to hack the lib
    age = (datetime.datetime(1, 12, 31) + age)
    return age.year - 2

이 해결책은 이상해서 당신과 공유했습니다.아마도 가장 우아한 기능은 아닐 것입니다.

now : 2019-09-21

print(calculate_age("2019-09-21")) => 2 (Done) 

-> age + (1,12,31) = 0004-01-01 23:42:17.767031

print(calculate_age("2020-09-21")) => 0 (Undone)

-> age + (1,12,31) = 0002-12-31 23:46:39.144091

그 차이는 하루입니다.차이가 나는 이유는 바이실테일(약진) 연도 때문인 것으로 알고 있습니다.

이 원치 않는 동작을 수정하려면 생일 연도를 사용하여 결과를 추가해야 합니다.

되지 않은 또 ▁mx는▁python입▁yetdate두▁both▁notrd다▁partye니timep▁of▁mx버▁lib▁is그red)▁3전cessor▁anothertime이▁mentioned(▁here전▁(의datetime 제 3자 및파티서드▁andtimeutil를 이 할 수 를 이 작업에 사용할 수 있습니다.

에서 말한 전한술.yearsago다음과 같습니다.

from mx.DateTime import now, RelativeDateTime

def years_ago(years, from_date=None):
    if from_date == None:
        from_date = now()
    return from_date-RelativeDateTime(years=years)

번째 는 " " " " " " 이 될 것으로 됩니다.DateTime사례.

보통으로 변환하는 방법datetimeDateTime로 사용 가능): 정밀도는 다음과 .

def DT_from_dt_s(t):
    return DT.DateTimeFromTicks(time.mktime(t.timetuple()))

또는 1마이크로초의 정밀도에 대해 다음을 수행합니다.

def DT_from_dt_u(t):
    return DT.DateTime(t.year, t.month, t.day, t.hour,
  t.minute, t.second + t.microsecond * 1e-6)

그리고 예, 문제의 단일 작업에 대한 의존성을 추가하는 것은 시간 활용도(Rick Copeland가 제안한)와 비교할 때 분명히 과잉 살상이 될 것입니다.

결국 여러분이 가지고 있는 것은 수학 문제입니다.4년마다 하루씩 시간이 더 있다면 365일이 아니라 365*4 + 1일로 시간 델타를 다이빙하면 4년의 시간이 주어집니다.그런 다음 다시 4. time delta / (365*4) +1) / 4 = time delta *4 / (365*4 +1)로 나눕니다.

이것이 제가 해결한 해결책입니다. 도움이 되길 바랍니다;-)

def menor_edad_legal(birthday):
    """ returns true if aged<18 in days """ 
    try:

        today = time.localtime()                        

        fa_divuit_anys=date(year=today.tm_year-18, month=today.tm_mon, day=today.tm_mday)

        if birthday>fa_divuit_anys:
            return True
        else:
            return False            

    except Exception, ex_edad:
        logging.error('Error menor de edad: %s' % ex_edad)
        return True

두 를 개 내 이 목 을 위 적 해 로 후 뺀 위 해 ▁subt raction ▁of ▁for ▁two ▁since 을 ▁purposes ▁my 적 목 두 개 를datetime 3.8)로 변환됩니다.timedelta▁▁a.days속성:

>>> admit = datetime.strptime('20130530', '%Y%m%d')
>>> birth = datetime.strptime('20010621', '%Y%m%d')
>>> age = (admit - birth).days/365.2425
>>> age
11.940012457476882

비록 이 스레드가 이미 죽었지만, 저는 제가 직면한 바로 그 문제에 대해 작동하는 해결책을 제안할 수 있습니다.다음과 같습니다(날짜는 dd-mm-yyyy 형식의 문자열입니다).

def validatedate(date):
    parts = date.strip().split('-')

    if len(parts) == 3 and False not in [x.isdigit() for x in parts]: 
        birth = datetime.date(int(parts[2]), int(parts[1]), int(parts[0]))
        today = datetime.date.today()

        b = (birth.year * 10000) + (birth.month * 100) + (birth.day)
        t = (today.year * 10000) + (today.month * 100) + (today.day)

        if (t - 18 * 10000) >= b:
            return True

    return False

이 함수는 두 날짜 사이의 연도 차이를 반환합니다(ISO 형식에서는 문자열로 사용되지만 어떤 형식으로든 쉽게 수정할 수 있음).

import time
def years(earlydateiso,  laterdateiso):
    """difference in years between two dates in ISO format"""

    ed =  time.strptime(earlydateiso, "%Y-%m-%d")
    ld =  time.strptime(laterdateiso, "%Y-%m-%d")
    #switch dates if needed
    if  ld < ed:
        ld,  ed = ed,  ld            

    res = ld[0] - ed [0]
    if res > 0:
        if ld[1]< ed[1]:
            res -= 1
        elif  ld[1] == ed[1]:
            if ld[2]< ed[2]:
                res -= 1
    return res

파이프데이트를 제안하겠습니다.

pyfdate란 무엇입니까?

Python의 목표가 강력하고 사용하기 쉬운 스크립팅 언어임을 감안할 때, 날짜와 시간으로 작업하기 위한 기능은 사용자 친화적이지 않습니다.pyfdate의 목적은 Python의 나머지 부분만큼 강력하고 사용하기 쉬운 날짜와 시간으로 작업할 수 있는 기능을 제공함으로써 이러한 상황을 해결하는 것입니다.

자습서

import datetime

def check_if_old_enough(years_needed, old_date):

    limit_date = datetime.date(old_date.year + years_needed,  old_date.month, old_date.day)

    today = datetime.datetime.now().date()

    old_enough = False

    if limit_date <= today:
        old_enough = True

    return old_enough



def test_ages():

    years_needed = 30

    born_date_Logan = datetime.datetime(1988, 3, 5)

    if check_if_old_enough(years_needed, born_date_Logan):
        print("Logan is old enough")
    else:
        print("Logan is not old enough")


    born_date_Jessica = datetime.datetime(1997, 3, 6)

    if check_if_old_enough(years_needed, born_date_Jessica):
        print("Jessica is old enough")
    else:
        print("Jessica is not old enough")


test_ages()

로건스 런 필름에서 캐러셀 운영자가 실행하던 코드입니다 ;)

https://en.wikipedia.org/wiki/Logan%27s_Run_(film)

저는 이 질문을 접했고 애덤스가 가장 도움이 되는 답변을 하는 것을 발견했습니다. https://stackoverflow.com/a/765862/2964689

하지만 그의 방법에 대한 파이썬의 예는 없었지만, 여기 제가 사용하게 된 것이 있습니다.

입력: datetime 객체

출력: 전체 연도의 정수 사용 기간

def age(birthday):
    birthday = birthday.date()
    today = date.today()

    years = today.year - birthday.year

    if (today.month < birthday.month or
       (today.month == birthday.month and today.day < birthday.day)):

        years = years - 1

    return years

저는 존 미의 해결책이 단순해서 좋았고, 윤년이 아닌 2월 28일이나 3월 1일에 2월 29일에 태어난 사람들의 나이를 어떻게 결정하는지에 대해서는 크게 걱정하지 않습니다.하지만 여기 불만 사항을 해결할 수 있는 그의 코드의 일부가 있습니다.

def age(dob):
    import datetime
    today = datetime.date.today()
    age = today.year - dob.year
    if ( today.month == dob.month == 2 and
         today.day == 28 and dob.day == 29 ):
         pass
    elif today.month < dob.month or \
      (today.month == dob.month and today.day < dob.day):
        age -= 1
    return age

나는 사용할 것입니다.datetime.date몇 년, 몇 개월, 며칠이 지났는지 확인하는 것이 더 간단하기 때문에 데이터 유형은 다음과 같습니다.

now = date.today()
birthday = date(1993, 4, 4)
print("you are", now.year - birthday.year, "years,", now.month - birthday.month, "months and",
  now.day - birthday.day, "days old")

출력:

you are 27 years, 7 months and 11 days old

사용합니다timedelta특정 날짜에 산술 연산을 수행해야 하는 경우:

age = now - birthday
print("addition of days to a date: ", birthday + timedelta(days=age.days))

출력:

addition of days to a date:  2020-11-15

언급URL : https://stackoverflow.com/questions/765797/convert-timedelta-to-years

반응형