Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Bạn cần nhiều hơn một

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
5 để cho biết bao nhiêu năm đã trôi qua; Bạn cũng cần biết ngày bắt đầu (hoặc kết thúc). (Đó là một năm bước nhảy vọt.)

Đặt cược tốt nhất của bạn là sử dụng đối tượng

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
6, nhưng đó là mô -đun của bên thứ 3. Nếu bạn muốn biết
    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
7 đó là
    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
8 năm kể từ ngày nào đó (mặc định đến ngay bây giờ), bạn có thể làm như sau ::

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)

Nếu bạn muốn gắn bó với thư viện tiêu chuẩn, câu trả lời phức tạp hơn một chút ::

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)

Nếu đó là 2/29 và 18 năm trước, không có 2/29, chức năng này sẽ trả lại 2/28. Nếu bạn muốn trả lại 3/1, chỉ cần thay đổi câu lệnh

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
9 cuối cùng để đọc ::

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

Câu hỏi của bạn ban đầu cho biết bạn muốn biết bao nhiêu năm kể từ một ngày nào đó. Giả sử bạn muốn có một số nguyên số năm, bạn có thể đoán dựa trên 365.2425 ngày mỗi năm và sau đó kiểm tra bằng một trong hai hàm

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
0 được xác định ở trên ::

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

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Đã trả lời ngày 19 tháng 4 năm 2009 lúc 20:05Apr 19, 2009 at 20:05

Rick Copelandrick CopelandRick Copeland

11.4K5 Huy hiệu vàng38 Huy hiệu bạc38 Huy hiệu đồng5 gold badges38 silver badges38 bronze badges

6

Nếu bạn đang cố gắng kiểm tra xem ai đó có 18 tuổi hay không, sử dụng

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
5 sẽ không hoạt động chính xác trên một số trường hợp cạnh vì năm nhảy. Ví dụ, một người nào đó sinh ngày 1 tháng 1 năm 2000, sẽ bước sang tuổi 18 chính xác 6575 ngày sau vào ngày 1 tháng 1 năm 2018 (bao gồm 5 năm bước nhảy), nhưng ai đó sinh ngày 1 tháng 1 năm 2001, sẽ bước sang tuổi 18 chính xác 6574 ngày sau ngày 1 tháng 1, 2019 (bao gồm 4 năm nhảy). Do đó, bạn nếu ai đó chính xác là 6574 ngày, bạn không thể xác định xem họ 17 hay 18 mà không biết thêm một chút thông tin về ngày sinh của họ.

Cách chính xác để làm điều này là tính độ tuổi trực tiếp từ ngày, bằng cách trừ hai năm, và sau đó trừ một nếu tháng/ngày hiện tại trước tháng/ngày sinh.

Đã trả lời ngày 19 tháng 4 năm 2009 lúc 18:36Apr 19, 2009 at 18:36

Adam Rosenfieldadam RosenfieldAdam Rosenfield

382K96 Huy hiệu vàng510 Huy hiệu bạc585 Huy hiệu Đồng96 gold badges510 silver badges585 bronze badges

3

Trước hết, ở cấp độ chi tiết nhất, vấn đề không thể được giải quyết chính xác. Năm khác nhau về chiều dài, và không có "lựa chọn đúng" rõ ràng cho chiều dài năm.

Điều đó nói rằng, có được sự khác biệt trong bất kỳ đơn vị nào là "tự nhiên" (có lẽ là giây) và chia theo tỷ lệ giữa đó và năm. Ví dụ.

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

...hay bất cứ cái gì. Tránh xa tháng, vì chúng thậm chí còn ít được xác định rõ hơn năm.

Đã trả lời ngày 19 tháng 4 năm 2009 lúc 18:08Apr 19, 2009 at 18:08

MarkusqmarkusqMarkusQ

21.7K3 Huy hiệu vàng55 Huy hiệu bạc67 Huy hiệu Đồng3 gold badges55 silver badges67 bronze badges

3

Đây là một chức năng DOB được cập nhật, tính toán ngày sinh nhật giống như cách con người làm:

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)))

Đã trả lời ngày 10 tháng 8 năm 2012 lúc 10:53Aug 10, 2012 at 10:53

Người chống anh hùngantihero

4235 Huy hiệu bạc10 Huy hiệu Đồng5 silver badges10 bronze badges

1

Nhận số ngày, sau đó chia cho 365.2425 (năm Gregorian trung bình) trong nhiều năm. Chia cho 30.436875 (tháng trung bình của Gregorian) trong nhiều tháng.

Đã trả lời ngày 24 tháng 12 năm 2009 lúc 21:13Dec 24, 2009 at 21:13

Brianarybrianarybrianary

8.8082 Huy hiệu vàng34 Huy hiệu bạc29 Huy hiệu đồng2 gold badges34 silver badges29 bronze badges

Làm thế nào chính xác bạn cần nó để trở thành?

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
2 sẽ khiến bạn khá gần, nếu bạn lo lắng về những năm bước nhảy.

Đã trả lời ngày 19 tháng 4 năm 2009 lúc 18:04Apr 19, 2009 at 18:04

Eduffyeduffyeduffy

38.4K12 Huy hiệu vàng93 Huy hiệu bạc91 Huy hiệu Đồng12 gold badges93 silver badges91 bronze badges

2

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

Đã trả lời ngày 30 tháng 11 năm 2009 lúc 1:51Nov 30, 2009 at 1:51

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

John Meejohn MeeJohn Mee

48.6K33 Huy hiệu vàng145 Huy hiệu bạc184 Huy hiệu đồng33 gold badges145 silver badges184 bronze badges

6

`Giải pháp đơn giản!

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}') `

Hoàn thành: Relativingelta (năm =+31, tháng =+3, ngày =+15)

Năm: 31, tháng: 3, ngày: 15

Đã trả lời ngày 16 tháng 5 năm 2021 lúc 6:33May 16, 2021 at 6:33

SajidsajidSajid

Huy hiệu đồng 2111 bronze badge

Tuy nhiên, một bên thứ 3 khác không được đề cập ở đây là mxdatetime (tiền thân của cả Python

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
7 và bên thứ 3
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
4) có thể được sử dụng cho nhiệm vụ này.

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
0 đã nói ở trên:

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)

Tham số đầu tiên dự kiến ​​là một ví dụ

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
6.

Để chuyển đổi thông thường

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
7 thành
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
6, bạn có thể sử dụng điều này trong 1 giây chính xác):

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

Hoặc điều này với độ chính xác 1 micro giây:

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)
0

Và vâng, việc thêm sự phụ thuộc cho nhiệm vụ duy nhất này trong câu hỏi chắc chắn sẽ là một quá mức cần thiết ngay cả khi sử dụng thời gian (được đề xuất bởi Rick Copeland).

Đã trả lời ngày 24 tháng 12 năm 2009 lúc 20:52Dec 24, 2009 at 20:52

Antony Hatchkinsantony HatchkinsAntony Hatchkins

30.2k9 Huy hiệu vàng107 Huy hiệu bạc108 Huy hiệu đồng9 gold badges107 silver badges108 bronze badges

Cuối cùng, những gì bạn có là một vấn đề toán học. Nếu cứ sau 4 năm, chúng ta có thêm một ngày, hãy nghỉ ngơi theo thời gian trong nhiều ngày, không phải bởi 365 mà là 365*4 + 1, điều đó sẽ cung cấp cho bạn số tiền 4 năm. Sau đó chia lại nó cho 4. Timedelta / ((365*4) +1) / 4 = Timedelta*4 / (365*4 +1)

Đã trả lời ngày 15 tháng 7 năm 2010 lúc 23:20Jul 15, 2010 at 23:20

NorbertonorbertoNorberto

1851 Huy hiệu vàng2 Huy hiệu bạc7 Huy hiệu đồng1 gold badge2 silver badges7 bronze badges

1

Đây là giải pháp tôi đã giải quyết, tôi hy vọng có thể giúp đỡ ;-)

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)
1

Đã trả lời ngày 10 tháng 3 năm 2011 lúc 14:29Mar 10, 2011 at 14:29

Pvilaspvilaspvilas

6325 Huy hiệu bạc7 Huy hiệu Đồng5 silver badges7 bronze badges

Muộn bữa tiệc, nhưng điều này sẽ cho bạn tuổi (tính theo năm) một cách chính xác và dễ dàng:

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

Đã trả lời ngày 2 tháng 12 năm 2020 lúc 5:19Dec 2, 2020 at 5:19

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Đối với mục đích của tôi vì phép trừ hai đối tượng

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
7 (ít nhất là trong Python 3.8) chuyển đổi thành
    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
5 chỉ với thuộc tính
delta_in_days / (365.25)
delta_in_seconds / (365.25*24*60*60)
1:

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)
3

Đã trả lời ngày 3 tháng 6 năm 2021 lúc 20:15Jun 3, 2021 at 20:15

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Jimhjimhjimh

1.3822 Huy hiệu vàng13 Huy hiệu bạc27 Huy hiệu đồng2 gold badges13 silver badges27 bronze badges

Phương pháp này là một hack của thư viện DateTime:

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)
4

Giải pháp này là kỳ lạ, vì vậy tôi đã chia sẻ nó với bạn. Nó có lẽ không phải là chức năng thanh lịch nhất.

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)
5

Sự khác biệt là một ngày. Tôi hiểu lý do cho sự khác biệt là do năm bisextile (Leap).

Để sửa chữa hành vi không mong muốn này, bạn cần sử dụng năm sinh nhật để thêm kết quả.

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

ouflak

2.42810 Huy hiệu vàng43 Huy hiệu bạc49 Huy hiệu đồng10 gold badges43 silver badges49 bronze badges

Đã trả lời ngày 21 tháng 9 năm 2021 lúc 21:30Sep 21, 2021 at 21:30

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Mặc dù chủ đề này đã chết, tôi có thể đề xuất một giải pháp làm việc cho vấn đề rất tương tự mà tôi đang phải đối mặt. Đây là (ngày là một chuỗi trong định dạng dd-mm-yyyy):

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)
6

Đã trả lời ngày 3 tháng 7 năm 2009 lúc 10:51Jul 3, 2009 at 10:51

Hàm này trả về sự khác biệt về năm giữa hai ngày (được lấy dưới dạng chuỗi ở định dạng ISO, nhưng nó có thể dễ dàng sửa đổi để thực hiện ở bất kỳ định dạng nào)

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)
7

Đã trả lời ngày 1 tháng 9 năm 2009 lúc 9:29Sep 1, 2009 at 9:29

Mauro Bianchimauro BianchiMauro Bianchi

6751 Huy hiệu vàng8 Huy hiệu bạc17 Huy hiệu đồng1 gold badge8 silver badges17 bronze badges

Tôi sẽ đề nghị pyfdate

Pyfdate là gì?

Với mục tiêu của Python là ngôn ngữ kịch bản mạnh mẽ và dễ sử dụng, các tính năng của nó để làm việc với ngày và thời gian không thân thiện với người dùng như họ nên có. Mục đích của pyfdate là khắc phục tình huống đó bằng cách cung cấp các tính năng để làm việc với ngày và thời gian mạnh mẽ và dễ sử dụng như phần còn lại của Python.

hướng dẫn

Đã trả lời ngày 1 tháng 12 năm 2009 lúc 4:48Dec 1, 2009 at 4:48

twilstwilstwils

2.5543 huy hiệu vàng17 Huy hiệu bạc7 Huy hiệu đồng3 gold badges17 silver badges7 bronze badges

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)
8

Đây là mã mà người vận hành CARROUSEL đang chạy trong bộ phim Run của Logan;)

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

Đã trả lời ngày 6 tháng 3 năm 2020 lúc 0:46Mar 6, 2020 at 0:46

Tôi đã bắt gặp câu hỏi này và tìm thấy Adams trả lời https://stackoverflow.com/A/765862/2964689

Nhưng không có ví dụ về phương pháp của anh ấy nhưng đây là những gì tôi đã sử dụng.

Đầu vào: Đối tượng DateTime

đầu ra: tuổi nguyên trong cả năm

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)
9

Đã trả lời ngày 9 tháng 6 năm 2020 lúc 8:21Jun 9, 2020 at 8:21

Sam SamSam

4444 Huy hiệu bạc18 Huy hiệu đồng4 silver badges18 bronze badges

Tôi thích giải pháp của John Mee vì sự đơn giản của nó, và tôi không quan tâm đến việc làm thế nào, vào ngày 28 tháng 2 hoặc ngày 1 tháng 3 khi đó không phải là một năm bước nhảy, để xác định tuổi của những người sinh ngày 29 tháng 2. Nhưng đây là một điều chỉnh mã mà tôi nghĩ giải quyết các khiếu nại:

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

Đã trả lời ngày 18 tháng 6 năm 2020 lúc 5:33Jun 18, 2020 at 5:33

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn

Gravesrick GravesrickRick Graves

4475 Huy hiệu bạc11 Huy hiệu đồng5 silver badges11 bronze badges

Thay vào đó, tôi sẽ sử dụng kiểu dữ liệu

delta_in_days / (365.25)
delta_in_seconds / (365.25*24*60*60)
2, vì nó đơn giản hơn khi kiểm tra số năm, tháng và ngày đã trôi qua:

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

Output:

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

Tôi sử dụng

    return from_date.replace(month=3, day=1,
                             year=from_date.year-years)
5 khi tôi cần thực hiện số học vào một ngày cụ thể:

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

Output:

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

Đã trả lời ngày 15 tháng 11 năm 2020 lúc 18:06Nov 15, 2020 at 18:06

Hướng dẫn timedelta years 1 python - timedelta năm 1 con trăn