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 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 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 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 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 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.- 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.
- 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
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 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 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.#! /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 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]
- 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
0 của mô -đun DateUtil để tạo đối tượng tương đối.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']
- Nhận được nhiều năm, tháng và ngày giữa hai ngày
Sử dụng thuộc tính
1 để có được nhiều năm. Cuối cùng, sử dụngfrom 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.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']
Next, Use the
2 to get months.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']
In the end, use
3 to get days.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']
- Chỉ nhận được nhiều tháng giữa hai ngày
Sử dụng công thức
4 để có được tổng số tháng 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']
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 ý:
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']
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 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]
0Tí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 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]
1Output::
#! /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 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]
2Bà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