Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
TimeDelta trong Python
Trong bài viết này, mình sẽ đi sâu vào cách tạo và sử dụng TimeDelta, làm thế nào để thực hiện các phép toán toán học và so sánh với TimeDelta, cùng với một số ví dụ thực tế để minh họa cách áp dụng linh hoạt của nó. Sau khi bạn hoàn thành việc đọc bài viết này, bạn sẽ có kiến thức vững chắc về cách sử dụng TimeDelta để làm việc hiệu quả với việc tính toán và quản lý thời gian trong ứng dụng Python của mình.
Hãy cùng bắt đầu hành trình tìm hiểu TimeDelta và tìm hiểu cách nó có thể làm thay đổi cách chúng ta làm việc với thời gian trong lập trình Python.
Timedelta trong Python là gì?
Timedelta trong Python là một đối tượng dùng để đại diện cho một khoảng thời gian giữa hai ngày hoặc thời điểm cụ thể.
Nó thuộc về module datetime
của Python và được sử dụng để thực hiện các phép toán liên quan đến thời gian, như tính toán khoảng cách giữa các sự kiện, làm việc với các đơn vị thời gian như ngày, giờ, phút và giây, cũng như thực hiện các phép toán toán học như cộng và trừ trên các khoảng thời gian.
Bài viết này được đăng tại [free tuts .net]
from datetime import timedelta
Ví dụ : Cách tính khoảng cách thời gian giữa hai ngày tháng
from datetime import datetime # Định nghĩa hai ngày tháng start_date = datetime(2023, 8, 1) end_date = datetime(2023, 8, 15) # Tính khoảng cách thời gian time_difference = end_date - start_date # In ra kết quả print(f"Khoảng cách thời gian: {time_difference}") print(f"Số ngày: {time_difference.days} ngày")
Kết quả:
Khoảng cách thời gian: 14 days, 0:00:00 Số ngày: 14 ngày
Ở đây, mình đã sử dụng đối tượng Timedelta để tính khoảng cách thời gian giữa hai ngày tháng (end_date - start_date
). Kết quả cho mình thấy rằng có 14 ngày chênh lệch giữa hai ngày đã cho.
Đối tượng thời gianDelta
Tạo đối tượng Timedelta
trong Python rất linh hoạt, cho phép bạn tính toán khoảng thời gian dựa trên các đơn vị khác nhau như ngày, giây, phút, giờ, tuần, mili giây và micro giây.
Dưới đây là một ví dụ cụ thể về cách tạo đối tượng Timedelta
và tính toán khoảng thời gian trong quá khứ và tương lai:
from datetime import datetime, timedelta # Định nghĩa một ngày cụ thể base_date = datetime(2023, 8, 1) # Tạo các đối tượng Timedelta với các đối số khác nhau past_timedelta = timedelta(days=15, hours=6) future_timedelta = timedelta(weeks=3, minutes=45) # Tính ngày trong quá khứ và tương lai past_date = base_date - past_timedelta future_date = base_date + future_timedelta # In kết quả print("Ngày trong quá khứ:", past_date) print("Ngày trong tương lai:", future_date)
Kết quả sẽ tương tự như sau:
Ngày trong quá khứ: 2023-07-17 18:00:00 Ngày trong tương lai: 2023-08-22 00:45:00
Trong ví dụ trên, mình đã sử dụng các đối số của đối tượng Timedelta
để tính toán ngày trong quá khứ và tương lai từ một ngày cụ thể (base_date
). Bạn có thể thay đổi giá trị của các đối số để thay đổi khoảng thời gian tính toán.
Lưu ý:
Các giá trị được lưu trữ bên trong đối tượng Timedelta trong Python được thể hiện dưới dạng ngày, giây và micro giây. Khi bạn truyền giá trị trong bất kỳ đơn vị nào khác, nó sẽ tự động chuyển đổi sang các đơn vị này. Ví dụ, một phần nghìn giây sẽ được chuyển đổi thành 1000 giây và một tuần sẽ được chuyển đổi thành 7 ngày.
Quá trình bình thường hóa một đối tượng Timedelta thường gom nhất các giá trị đối số của nó thành ba thuộc tính chính: ngày, giây và micro giây. Việc này được thực hiện tự động trong quá trình lưu trữ của đối tượng Timedelta.
Trong quá trình gom nhất, các giá trị thường được kiểm tra để đảm bảo rằng chúng nằm trong phạm vi hợp lệ, như được đề cập trong bảng dưới đây. Nếu giá trị nằm ngoài phạm vi này, một ngoại lệ kiểu OverflowError sẽ được ném ra.
Thuộc tính | Giá trị (Bao gồm giá trị tối đa và tối thiểu) |
---|---|
days | Giữa -999999999 và 999999999 |
seconds | Từ 0 đến 86399 (3600*24 số giây trong một ngày) |
microseconds | Giữa 0 và 999999 |
Thông tin này giúp bạn hiểu rõ hơn về cách Timedelta xử lý và biểu diễn các giá trị thời gian trong Python.
Thuộc tính TimeDelta
Thuộc tính của đối tượng Timedelta trong Python cho phép chúng ta truy cập vào các phần khác nhau của khoảng thời gian, như ngày, giây, phút và giờ.
Thuộc tính | Ý nghĩa |
---|---|
timedelta.days | Trả về ngày từ timedelta |
timedelta.microseconds | Trả về micro giây từ timedelta |
timedelta.seconds | Trả về giây từ timedelta |
timedelta.max | Trả về giá trị timedelta dương lớn nhất, nó sẽ làdatetime.timedelta(999999999, 86399, 999999) |
timedelta.min | Trả về giá trị timedelta âm nhất và giá trị của nó làdatetime.timedelta(-999999999) |
timedelta.resolution | Sự khác biệt nhỏ nhất có thể có giữa hai đối tượng delta thời gian không bằng nhau là 1 micro giây. |
timedelta.total_seconds() | Trả về tổng số giây trong khoảng thời gian |
Ví dụ :
from datetime import datetime d1 = datetime(year=2020, month=3, day=21, hour=12, minute=30) d2 = datetime(year=2021, month=1, day=12, hour=18, minute=15) # Get timedelta by subtracting two dates td = d2 - d1 # access timedelta attributes print("Days:", td.days) print("Microseconds:", td.microseconds) print("seconds:", td.seconds) print("Max:", td.max) print("Min:", td.min) print("Resolution:", td.resolution) print("Total Seconds:", td.total_seconds())
Kết quả:
Ngày: 297 Micro giây: 0 giây: 20700 Tối đa: 999999999 ngày, 23:59:59,999999 Tối thiểu: -999999999 ngày, 0:00:00 Độ phân giải: 0:00:00.000001 Tổng số giây: 25681500,0
TimeDelta với Tuần
Trong Python, bạn có thể sử dụng đơn vị "week" để tạo đối tượng Timedelta và thực hiện các phép toán liên quan đến khoảng thời gian theo tuần.
Dưới đây là một ví dụ về cách sử dụng đơn vị "week" với đối tượng Timedelta:
from datetime import datetime, timedelta current_date = datetime.now() print("Ngày và Giờ Hiện tại:", current_date) # Trừ đi 6 tuần past_date = current_date - timedelta(weeks=6) print("Ngày Quá Khứ:", past_date) # Cộng thêm 2 tuần future_date = current_date + timedelta(weeks=2) print("Ngày Tương Lai:", future_date)
Kết quả :
Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự) Ngày Quá Khứ: 2023-07-06 08:30:00.123456 (6 tuần trước thời điểm hiện tại) Ngày Tương Lai: 2023-08-31 08:30:00.123456 (2 tuần sau thời điểm hiện tại)
TimeDelta với giây và micro giây
Mình sử dụng thuộc tính seconds
và mili
giây của một timedelta
đối tượng để tính thời gian trước hoặc sau vài giây/mili giây .
from datetime import datetime, timedelta current_date = datetime.now() print("Current Date and Time : ", current_date) # add 60 seconds future_date = current_date + timedelta(seconds=6) print("60 seconds After: ", future_date) # subtract 500 milliseconds past_date = current_date - timedelta(milliseconds=500) print("500 Milliseconds Before: ", past_date)
Kết quả dự kiến (chú ý rằng thời điểm chính xác sẽ khác nhau khi bạn chạy mã):
Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự) Sau 60 giây: 2023-08-17 08:31:00.123456 (60 giây sau thời điểm hiện tại) Trước 500 mili giây: 2023-08-17 08:29:59.623456 (500 mili giây trước thời điểm hiện tại)
TimeDelta sang Giây
Một đối tượng Timedelta trong Python cung cấp phương thức total_seconds()
để tính tổng số giây trong khoảng thời gian đó. Kết quả trả về là một giá trị số dấu phẩy động chính xác đến micro giây. Tuy nhiên, khi xử lý các khoảng thời gian lớn, ví dụ như 270 năm, phương thức này có thể mất mát độ chính xác của phần triệu giây.
Do đó, phương pháp total_seconds()
thường được ưa chuộng để chuyển đổi đối tượng Timedelta thành một số dấu phẩy động, nhưng nên cẩn trọng khi sử dụng cho các khoảng thời gian lớn.
Nói cách khác, phương pháp total_seconds()
là cách tiện lợi để tính số giây từ một đối tượng Timedelta, nhưng nếu bạn cần độ chính xác cao với các khoảng thời gian lớn, bạn nên xem xét các phương pháp khác như làm việc trực tiếp với các thành phần ngày, giây và micro giây của đối tượng Timedelta.
from datetime import timedelta td = timedelta(minutes=5) print("Number of seconds in timedelta:", td.total_seconds()) # Output 300.0
Time Delta với ngày và giờ
Mình có thể dự đoán ngày trong tương lai và ngày trong quá khứ bằng cách thêm hoặc trừ một khoảng thời gian từ ngày hiện tại, bằng cách cung cấp số ngày mong muốn cho đối tượng Timedelta.
from datetime import datetime, timedelta current_date = datetime.now() print("Current Date and Time : ", current_date) # add 100 days future_date = current_date + timedelta(days=100) print("Date 100 days later: ", future_date) # subtract 100 days past_date = current_date - timedelta(days=100) print("Date 100 days before: ", past_date)
Kết quả:
Ngày và Giờ Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự) Ngày 100 ngày sau: 2023-11-25 08:30:00.123456 Ngày 100 ngày trước: 2023-05-09 08:30:00.123456
TimeDelta với Giờ
Mình có thể tính thời gian trước hoặc sau thời điểm hiện tại bằng cách sử dụng đối tượng Timedelta với số giờ cụ thể.
from datetime import datetime, timedelta # Lấy thời điểm hiện tại current_time = datetime.now() print("Thời gian Hiện tại:", current_time) # Số giờ mong muốn trước và sau hours_before = 2 hours_after = 3 # Tính thời gian trước và sau bằng cách thêm/trừ đối tượng Timedelta time_before = current_time - timedelta(hours=hours_before) time_after = current_time + timedelta(hours=hours_after) # In kết quả print(f"{hours_before} giờ trước: {time_before}") print(f"{hours_after} giờ sau: {time_after}")
Kêt quả:
Thời gian Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự) 2 giờ trước: 2023-08-17 06:30:00.123456 3 giờ sau: 2023-08-17 11:30:00.123456
Cộng hoặc trừ hai đối tượng timedelta.
Trong quá trình tính toán sự khác biệt giữa hai ngày, ta có thể sử dụng đối tượng timedelta
để biểu thị khoảng thời gian bằng cách cộng hoặc trừ chúng. Bằng cách trừ hai đối tượng timedelta, mình có thể tính toán sự chênh lệch thời gian giữa chúng.
Hãy xem ví dụ sau để hiểu rõ hơn:
from datetime import datetime, timedelta # Lấy thời điểm hiện tại current_time = datetime.now() print("Thời gian Hiện tại:", current_time) # Tạo các đối tượng timedelta biểu thị khoảng thời gian time_difference_1 = timedelta(weeks=2, days=2, hours=12, minutes=30) time_difference_2 = timedelta(weeks=1, days=1, hours=11, minutes=30) # Tính toán sự khác biệt giữa hai đối tượng timedelta time_difference = time_difference_1 - time_difference_2 # Lấy thời điểm mới cách ngày hiện tại theo khoảng thời gian tính toán new_time = current_time + time_difference # In kết quả print("Sự khác biệt thời gian:", time_difference) print("Thời gian mới:", new_time)
Kết quả:
Thời gian Hiện tại: 2023-08-17 08:30:00.123456 (hoặc thời điểm hiện tại tương tự) Sự khác biệt thời gian: 7 days, 1:00:00 Thời gian mới: 2023-08-24 09:30:00.123456
Ngoài việc thực hiện phép cộng và phép trừ giữa hai đối tượng Timedelta, mình còn có thể thực hiện các thao tác sau với chúng:
-
Nhân với giá trị dấu phẩy động: Chúng ta có thể nhân một đối tượng Timedelta với một số nguyên hoặc số thực. Kết quả của phép nhân sẽ được làm tròn đến bội số gần nhất của
timedelta.resolution.
-
Phép toán modulo: Mình có thể sử dụng phép toán modulo (%) với hai đối tượng Timedelta. Kết quả của phép toán modulo sẽ là một đối tượng Timedelta biểu thị phần còn lại sau khi chia hai khoảng thời gian.
Dưới đây là cách thực hiện hai thao tác này:
from datetime import timedelta # Tạo một đối tượng timedelta time_difference = timedelta(days=5, hours=3, minutes=30) # Nhân với giá trị dấu phẩy động multiplied_timedelta = time_difference * 1.5 # Nhân với 1.5 # Thực hiện phép toán modulo other_timedelta = timedelta(days=2, hours=2, minutes=15) modulo_result = time_difference % other_timedelta # In kết quả print("Đối tượng Timedelta ban đầu:", time_difference) print("Sau khi nhân:", multiplied_timedelta) print("Kết quả phép toán modulo:", modulo_result)
Kết quả:
Đối tượng Timedelta ban đầu: 5 days, 3:30:00 Sau khi nhân: 7 days, 10:30:00 Kết quả phép toán modulo: 2 days, 1:15:00
Định dạng Timedelta
Sau khi tính toán khoảng thời gian trong tương lai hoặc quá khứ bằng cách sử dụng đối tượng Timedelta, chúng ta có thể sử dụng hàm strftime()
để định dạng timedelta và hiển thị nó theo định dạng mong muốn.
from datetime import datetime, timedelta # Tính toán khoảng thời gian ở tương lai và quá khứ future_date = datetime.now() + timedelta(days=10, hours=5, minutes=30) past_date = datetime.now() - timedelta(days=5, hours=2, minutes=15) # Định dạng và hiển thị khoảng thời gian future_formatted = future_date.strftime("%Y-%m-%d %H:%M:%S") past_formatted = past_date.strftime("%Y-%m-%d %H:%M:%S") # In kết quả print("Ngày trong tương lai định dạng:", future_formatted) print("Ngày trong quá khứ định dạng:", past_formatted)
Kết quả:
Ngày trong tương lai định dạng: 2023-08-27 16:45:00 Ngày trong quá khứ định dạng: 2023-08-12 06:15:00
Kết bài
Trong bài viết này, mình đã tìm hiểu về đối tượng Timedelta trong Python và cách sử dụng nó để thực hiện các tính toán về khoảng thời gian.Mình đã khám phá cách tạo đối tượng Timedelta bằng cách cung cấp các đối số như ngày, giây, phút, giờ, tuần, mili giây và micro giây.
Ta đã thấy cách tính toán sự chênh lệch thời gian giữa hai ngày, và cách thực hiện các phép cộng, trừ, nhân và phép toán modulo với các đối tượng Timedelta. Điều này cho phép ta thực hiện các tính toán phức tạp liên quan đến thời gian một cách dễ dàng.
Cuối cùng, mình đã tìm hiểu cách định dạng đối tượng Timedelta và hiển thị nó theo định dạng mong muốn bằng cách sử dụng hàm strftime().
Hi vọng rằng thông qua bài viết này, bạn đã có cái nhìn tổng quan về cách sử dụng đối tượng Timedelta để làm việc với khoảng thời gian trong Python. Điều này sẽ giúp bạn thực hiện các tính toán thời gian và xử lý các vấn đề liên quan đến thời gian một cách hiệu quả.