Hướng dẫn python get month between two dates - python nhận được tháng giữa hai ngày

Tôi thực sự cần phải làm một cái gì đó khá giống nhau bây giờ

Cuối cùng, đã viết một hàm trả về một danh sách các bộ dữ liệu cho biết

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
3 và
#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
4 của mỗi tháng giữa hai bộ ngày để tôi có thể viết một số truy vấn SQL từ mặt sau của nó cho tổng doanh số hàng tháng, v.v.

Tôi chắc rằng nó có thể được cải thiện bởi một người biết họ đang làm gì nhưng hy vọng nó sẽ giúp ...

Giá trị trả về như sau (tạo cho ngày hôm nay - 365 ngày cho đến hôm nay làm ví dụ)

[   (datetime.date(2013, 5, 1), datetime.date(2013, 5, 31)),
    (datetime.date(2013, 6, 1), datetime.date(2013, 6, 30)),
    (datetime.date(2013, 7, 1), datetime.date(2013, 7, 31)),
    (datetime.date(2013, 8, 1), datetime.date(2013, 8, 31)),
    (datetime.date(2013, 9, 1), datetime.date(2013, 9, 30)),
    (datetime.date(2013, 10, 1), datetime.date(2013, 10, 31)),
    (datetime.date(2013, 11, 1), datetime.date(2013, 11, 30)),
    (datetime.date(2013, 12, 1), datetime.date(2013, 12, 31)),
    (datetime.date(2014, 1, 1), datetime.date(2014, 1, 31)),
    (datetime.date(2014, 2, 1), datetime.date(2014, 2, 28)),
    (datetime.date(2014, 3, 1), datetime.date(2014, 3, 31)),
    (datetime.date(2014, 4, 1), datetime.date(2014, 4, 30)),
    (datetime.date(2014, 5, 1), datetime.date(2014, 5, 31))]

Mã như sau (có một số thứ gỡ lỗi có thể được xóa):

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)

Sau khi đọc bài viết này, bạn sẽ học cách tìm năm và tháng giữa hai ngày ở Python.

Ngoài ra, xem sự khác biệt giữa hai ngày tính bằng ngày trong Python.

Cách tính toán năm và tháng giữa hai ngày

Mô -đun Python DateUtil cung cấp một lớp

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
5, đại diện cho một khoảng thời gian. Ví dụ, chúng ta có thể tìm thấy sự khác biệt giữa hai ngày trong năm, tháng, ngày, giờ, phút, giây và micro giây bằng lớp
#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
5. Các bước dưới đây cho thấy cách xác định số năm và tháng giữa hai ngày hoặc đối tượng DateTime.

  1. Nhập ngày mô -đun

    DateUtil là mô-đun của bên thứ ba cung cấp các tiện ích mở rộng mạnh mẽ cho mô-đun DateTime tiêu chuẩn, có sẵn trong Python.

  2. Chuyển đổi chuỗi ngày thành đối tượng DateTime

    Nếu một ngày ở định dạng chuỗi, chúng ta cần chuyển đổi một chuỗi thành đối tượng DateTime trước khi tính toán sự khác biệt trong tháng. Sử dụng hàm

    #! /usr/env/python
    import datetime
    
    def gen_month_ranges(start_date=None, end_date=None, debug=False):
        today = datetime.date.today()
        if not start_date: start_date = datetime.datetime.strptime(
            "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
        if not end_date: end_date = today
        if debug: print("Start: {0} | End {1}".format(start_date, end_date))
    
        # sense-check
        if end_date < start_date:
            print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
            return None
    
        date_ranges = []  # list of tuples (month_start, month_end)
    
        current_year = start_date.year
        current_month = start_date.month
    
        while current_year <= end_date.year:
            next_month = current_month + 1
            next_year = current_year
            if next_month > 12:
                next_month = 1
                next_year = current_year + 1
    
            month_start = datetime.datetime.strptime(
                "{0}/{1}/01".format(current_year,
                                    current_month),"%Y/%m/%d").date()  # start of month
            month_end = datetime.datetime.strptime(
                "{0}/{1}/01".format(next_year,
                                    next_month),"%Y/%m/%d").date()  # start of next month
            month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day
    
            range_tuple = (month_start, month_end)
            if debug: print("Month runs from {0} --> {1}".format(
                range_tuple[0], range_tuple[1]))
            date_ranges.append(range_tuple)
    
            if current_month == 12:
                current_month = 1
                current_year += 1
                if debug: print("End of year encountered, resetting months")
            else:
                current_month += 1
                if debug: print("Next iteration for {0}-{1}".format(
                    current_year, current_month))
    
            if current_year == end_date.year and current_month > end_date.month:
                if debug: print("Final month encountered. Terminating loop")
                break
    
        return date_ranges
    
    
    if __name__ == '__main__':
        print("Running in standalone mode. Debug set to True")
        from pprint import pprint
        pprint(gen_month_ranges(debug=True), indent=4)
        pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                                debug=True), indent=4)
    
    7 để chuyển đổi chuỗi ngày thành đối tượng DateTime theo
    #! /usr/env/python
    import datetime
    
    def gen_month_ranges(start_date=None, end_date=None, debug=False):
        today = datetime.date.today()
        if not start_date: start_date = datetime.datetime.strptime(
            "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
        if not end_date: end_date = today
        if debug: print("Start: {0} | End {1}".format(start_date, end_date))
    
        # sense-check
        if end_date < start_date:
            print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
            return None
    
        date_ranges = []  # list of tuples (month_start, month_end)
    
        current_year = start_date.year
        current_month = start_date.month
    
        while current_year <= end_date.year:
            next_month = current_month + 1
            next_year = current_year
            if next_month > 12:
                next_month = 1
                next_year = current_year + 1
    
            month_start = datetime.datetime.strptime(
                "{0}/{1}/01".format(current_year,
                                    current_month),"%Y/%m/%d").date()  # start of month
            month_end = datetime.datetime.strptime(
                "{0}/{1}/01".format(next_year,
                                    next_month),"%Y/%m/%d").date()  # start of next month
            month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day
    
            range_tuple = (month_start, month_end)
            if debug: print("Month runs from {0} --> {1}".format(
                range_tuple[0], range_tuple[1]))
            date_ranges.append(range_tuple)
    
            if current_month == 12:
                current_month = 1
                current_year += 1
                if debug: print("End of year encountered, resetting months")
            else:
                current_month += 1
                if debug: print("Next iteration for {0}-{1}".format(
                    current_year, current_month))
    
            if current_year == end_date.year and current_month > end_date.month:
                if debug: print("Final month encountered. Terminating loop")
                break
    
        return date_ranges
    
    
    if __name__ == '__main__':
        print("Running in standalone mode. Debug set to True")
        from pprint import pprint
        pprint(gen_month_ranges(debug=True), indent=4)
        pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                                debug=True), indent=4)
    
    8 tương ứng. Ví dụ: chuỗi có thể ở định dạng
    #! /usr/env/python
    import datetime
    
    def gen_month_ranges(start_date=None, end_date=None, debug=False):
        today = datetime.date.today()
        if not start_date: start_date = datetime.datetime.strptime(
            "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
        if not end_date: end_date = today
        if debug: print("Start: {0} | End {1}".format(start_date, end_date))
    
        # sense-check
        if end_date < start_date:
            print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
            return None
    
        date_ranges = []  # list of tuples (month_start, month_end)
    
        current_year = start_date.year
        current_month = start_date.month
    
        while current_year <= end_date.year:
            next_month = current_month + 1
            next_year = current_year
            if next_month > 12:
                next_month = 1
                next_year = current_year + 1
    
            month_start = datetime.datetime.strptime(
                "{0}/{1}/01".format(current_year,
                                    current_month),"%Y/%m/%d").date()  # start of month
            month_end = datetime.datetime.strptime(
                "{0}/{1}/01".format(next_year,
                                    next_month),"%Y/%m/%d").date()  # start of next month
            month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day
    
            range_tuple = (month_start, month_end)
            if debug: print("Month runs from {0} --> {1}".format(
                range_tuple[0], range_tuple[1]))
            date_ranges.append(range_tuple)
    
            if current_month == 12:
                current_month = 1
                current_year += 1
                if debug: print("End of year encountered, resetting months")
            else:
                current_month += 1
                if debug: print("Next iteration for {0}-{1}".format(
                    current_year, current_month))
    
            if current_year == end_date.year and current_month > end_date.month:
                if debug: print("Final month encountered. Terminating loop")
                break
    
        return date_ranges
    
    
    if __name__ == '__main__':
        print("Running in standalone mode. Debug set to True")
        from pprint import pprint
        pprint(gen_month_ranges(debug=True), indent=4)
        pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                                debug=True), indent=4)
    
    9.

  3. Tạo một đối tượng tương đối

    Tạo một đối tượng tương đối, đại diện cho khoảng giữa hai ngày đã cho. Sử dụng chức năng

    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    0 của mô -đun DateUtil để tạo đối tượng tương đối.

  4. Nhận được nhiều năm, tháng và ngày giữa hai ngày

    Sử dụng thuộc tính

    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    1 để có được nhiều năm. Cuối cùng, sử dụng
    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    3 để có được ngày.
    Next, Use the
    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    2 to get months.
    In the end, use
    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    3 to get days.

  5. Chỉ nhận được nhiều tháng giữa hai ngày

    Sử dụng công thức

    from datetime import datetime
    from dateutil import relativedelta
    
    # get two dates
    d1 = '14/8/2019'
    d2 = '16/3/2022'
    
    # convert string to date object
    start_date = datetime.strptime(d1, "%d/%m/%Y")
    end_date = datetime.strptime(d2, "%d/%m/%Y")
    
    # Get the relativedelta between two dates
    delta = relativedelta.relativedelta(end_date, start_date)
    print('Years, Months, Days between two dates is')
    print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
    4 để có được tổng số tháng giữa hai ngày.

Ví dụ: Nhận năm, tháng và ngày giữa hai ngày

Hãy giả sử rằng chúng tôi có hai ngày ,1414/8/2019 và và1616/3/2022. Sau khi thực hiện ví dụ dưới đây, chúng ta nên có được sự khác biệt 2 năm, 7 tháng và 2 ngày giữa hai ngày.

from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)
print('Years, Months, Days between two dates is')
print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')

Output::

Years, Months, Days between two dates is
2 Years, 7 months, 2 days

Ví dụ: Chỉ nhận được tháng giữa hai ngày

Lưu ý:

from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)
print('Years, Months, Days between two dates is')
print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
2 Trả về sự khác biệt tương đối, tức là, từ 0 đến 12. Vì vậy, để có được một số tuyệt đối, chúng ta cần tính số năm giữa hai ngày, nhân chúng với 12 và thêm chúng vào
from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)
print('Years, Months, Days between two dates is')
print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
2.
: The
from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)
print('Years, Months, Days between two dates is')
print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
2 return the relative difference, i.e., from 0 to 12. So to get an absolute number, we need to calculate the number of years between two dates, multiply them by 12 and add them to
from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)
print('Years, Months, Days between two dates is')
print(delta.years, 'Years,', delta.months, 'months,', delta.days, 'days')
2.

from datetime import datetime
from dateutil import relativedelta

# get two dates
d1 = '14/8/2019'
d2 = '16/3/2022'

# convert string to date object
start_date = datetime.strptime(d1, "%d/%m/%Y")
end_date = datetime.strptime(d2, "%d/%m/%Y")

# Get the relativedelta between two dates
delta = relativedelta.relativedelta(end_date, start_date)

# get months difference
res_months = delta.months + (delta.years * 12)
print('Total Months between two dates is:', res_months)

Đầu ra::

Total Months between two dates is: 31

Ngoài ra, xem Tính số ngày giữa hai ngày trong Python.

Sự khác biệt giữa hai ngày tính bằng tháng bằng mô -đun DateTime

Thay vì sử dụng mô-đun DateUtil, chúng ta có thể sử dụng mô-đun DateTime tích hợp để có các tháng theo lịch giữa hai ngày.

Sử dụng công thức dưới đây để tính toán.

res = (end_date.year - start_date.year) * 12 + (end_date.month - start_date.month)

Example::

from datetime import datetime

date_1 = '24/12/2021'
date_2 = '26/3/2022'

start = datetime.strptime(date_1, "%d/%m/%Y")
end = datetime.strptime(date_2, "%d/%m/%Y")

res = (end.year - start.year) * 12 + (end.month - start.month)
print('Difference between dates in months:', res)

Output::

Difference between dates in months: 3

Note::

Sử dụng mô -đun DateTime khi bạn cần sự khác biệt trong tháng lịch. Don Tiết sử dụng mô -đun DateTime để tính toán các tháng chính xác giữa hai ngày.calendar month. Don’t use the datetime module to calculate the exact months between two dates.

Ví dụ, sự khác biệt giữa 303030/1/2022 và 1/2/2022 là 2 ngày, nhưng ví dụ trên cho thấy 1 tháng. Vì vậy, luôn luôn sử dụng mô -đun DateUtil để có được kết quả chính xác.2 days, but the above example shows 1 month. So always use the dateutil module to get the correct results.

Ví dụ 1: Mô -đun DateTime: Datetime module

from datetime import datetime

from dateutil import relativedelta
start = datetime.strptime('30/1/2022', "%d/%m/%Y")
end = datetime.strptime('1/2/2022', "%d/%m/%Y")

res = (end.year - start.year) * 12 + (end.month - start.month)
print('Months between two dates is:', res)

# Output 1

Ví dụ 2: Mô -đun DateUtil: Dateutil module

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
0

Tính tháng giữa hai đối tượng DateTime

Có những trường hợp bạn nhận được ngày trong một đối tượng DateTime thay vì một chuỗi. Trong những trường hợp như vậy, bạn không cần phải chuyển đổi chúng. Bạn có thể trực tiếp tính toán sự khác biệt giữa chúng.

Thí dụ::

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
1

Output::

#! /usr/env/python
import datetime

def gen_month_ranges(start_date=None, end_date=None, debug=False):
    today = datetime.date.today()
    if not start_date: start_date = datetime.datetime.strptime(
        "{0}/01/01".format(today.year),"%Y/%m/%d").date()  # start of this year
    if not end_date: end_date = today
    if debug: print("Start: {0} | End {1}".format(start_date, end_date))

    # sense-check
    if end_date < start_date:
        print("Error. Start Date of {0} is greater than End Date of {1}?!".format(start_date, end_date))
        return None

    date_ranges = []  # list of tuples (month_start, month_end)

    current_year = start_date.year
    current_month = start_date.month

    while current_year <= end_date.year:
        next_month = current_month + 1
        next_year = current_year
        if next_month > 12:
            next_month = 1
            next_year = current_year + 1

        month_start = datetime.datetime.strptime(
            "{0}/{1}/01".format(current_year,
                                current_month),"%Y/%m/%d").date()  # start of month
        month_end = datetime.datetime.strptime(
            "{0}/{1}/01".format(next_year,
                                next_month),"%Y/%m/%d").date()  # start of next month
        month_end  = month_end+datetime.timedelta(days=-1)  # start of next month less one day

        range_tuple = (month_start, month_end)
        if debug: print("Month runs from {0} --> {1}".format(
            range_tuple[0], range_tuple[1]))
        date_ranges.append(range_tuple)

        if current_month == 12:
            current_month = 1
            current_year += 1
            if debug: print("End of year encountered, resetting months")
        else:
            current_month += 1
            if debug: print("Next iteration for {0}-{1}".format(
                current_year, current_month))

        if current_year == end_date.year and current_month > end_date.month:
            if debug: print("Final month encountered. Terminating loop")
            break

    return date_ranges


if __name__ == '__main__':
    print("Running in standalone mode. Debug set to True")
    from pprint import pprint
    pprint(gen_month_ranges(debug=True), indent=4)
    pprint(gen_month_ranges(start_date=datetime.date.today()+datetime.timedelta(days=-365),
                            debug=True), indent=4)
2

Bài tập và câu đố Python

Các bài tập mã hóa miễn phí và các câu đố bao gồm các vấn đề cơ bản của Python, cấu trúc dữ liệu, phân tích dữ liệu, v.v.

  • Hơn 15 bài tập và câu đố dành riêng cho chủ đềTopic-specific Exercises and Quizzes
  • Mỗi bài tập chứa 10 câu hỏi
  • Mỗi bài kiểm tra chứa 12-15 mcq

Làm thế nào để tôi có được tháng giữa hai ngày trong Python?

Sử dụng tương đốitelta.months + RelativeSelta.Years * 12 Công thức để có được tổng số tháng giữa hai ngày.relativedelta. months + relativedelta. years * 12 formula to get the total months between two dates.

Làm thế nào để bạn tính toán tháng giữa hai ngày?

Sử dụng chức năng này, chúng tôi có thể trả về số tháng hoàn thành giữa hai ngày theo cú pháp sau ;..
= Datedif (start_date, end_date, Hồi Mv).
=DATEDIF(B2,C2,"M").
=(YEAR(end_date)-YEAR(start_date))*12+MONTH(end_date)-MONTH(start_date).
=(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2).
= YearFrac (start_date, end_date) * 12 ..

Làm thế nào để bạn tạo ra một phạm vi ngày hàng tháng trong Python?

Làm thế nào để bạn tạo ra một phạm vi ngày hàng tháng trong Python ?..
Nhập gấu trúc dưới dạng pd min_date = "2020-01-01" max_date = "2020-12-31".
ngày = pd.ngày_range (min_date, max_date) ngày ..
ngày = pd ..
MIN_MONTH = "2020-01" MAX_MONTH = "2020-12" tháng = PD ..
months..
min_year = "1995" max_year = "2021" năm = pd ..

Làm cách nào để nhận được số tháng trong Python?

Để có được tên tháng phiên bản đầy đủ bằng cách sử dụng DateTime Python, hãy gọi strftime () với %m được truyền làm đối số.call strftime() with %m passed as argument.