Làm thế nào để trừ một ngày từ một ngày?


Câu trả lời:


1292

Bạn có thể sử dụng một đối tượng timedelta :

from datetime import datetime, timedelta

d = datetime.today() - timedelta(days=days_to_subtract)

14
nếu bạn không bỏ qua múi giờ thì câu trả lời phức tạp hơn .
jfs

Ngoài ra, làm thế nào để bạn liên hệ nó với một ngày cụ thể. Xem câu hỏi của tôi: stackoverflow.com/questions/43092508/
Ấn

7
trong python 3 chỉ là: nhập datetime và sau đó d = datetime.today () - datetime.timedelta (days = days_to_subtract)
Alex

Nó cũng hoạt động với các đơn vị khác, tôi đã sử dụng nó với timedelta(minutes=12)ví dụ.
Nagev

@legalalien: kiểm tra xem các báo cáo nhập của bạn: import datetime as DT; DT.datetime.today()hoạt động trên cả Python 2 và 3. Nó tương đương với DT.datetime.now().
jfs


62

Nếu đối tượng datetime Python của bạn nhận thức được múi giờ hơn bạn nên cẩn thận để tránh các lỗi xung quanh chuyển đổi DST (hoặc thay đổi trong bù UTC vì các lý do khác):

from datetime import datetime, timedelta
from tzlocal import get_localzone # pip install tzlocal

DAY = timedelta(1)
local_tz = get_localzone()   # get local timezone
now = datetime.now(local_tz) # get timezone-aware datetime object
day_ago = local_tz.normalize(now - DAY) # exactly 24 hours ago, time may differ
naive = now.replace(tzinfo=None) - DAY # same time
yesterday = local_tz.localize(naive, is_dst=None) # but elapsed hours may differ

Nói chung, day_agoyesterday có thể khác nhau nếu bù UTC cho múi giờ địa phương đã thay đổi vào ngày cuối cùng.

Ví dụ: thời gian tiết kiệm ánh sáng ban ngày / thời gian mùa hè kết thúc vào Chủ nhật 2 tháng 11 năm 2014 lúc 02:00:00 sáng ở Mỹ / múi giờ Los_Angele do:

import pytz # pip install pytz

local_tz = pytz.timezone('America/Los_Angeles')
now = local_tz.localize(datetime(2014, 11, 2, 10), is_dst=None)
# 2014-11-02 10:00:00 PST-0800

sau đó day_agoyesterdaykhác nhau:

  • day_agochính xác là 24 giờ trước (so với now) nhưng lúc 11 giờ sáng, không phải lúc 10 giờ sáng nhưnow
  • yesterdaylà ngày hôm qua lúc 10 giờ sáng nhưng là 25 giờ trước (so với now), không phải 24 giờ.

pendulummô-đun xử lý nó tự động:

>>> import pendulum  # $ pip install pendulum

>>> now = pendulum.create(2014, 11, 2, 10, tz='America/Los_Angeles')
>>> day_ago = now.subtract(hours=24)  # exactly 24 hours ago
>>> yesterday = now.subtract(days=1)  # yesterday at 10 am but it is 25 hours ago

>>> (now - day_ago).in_hours()
24
>>> (now - yesterday).in_hours()
25

>>> now
<Pendulum [2014-11-02T10:00:00-08:00]>
>>> day_ago
<Pendulum [2014-11-01T11:00:00-07:00]>
>>> yesterday
<Pendulum [2014-11-01T10:00:00-07:00]>

41

Chỉ cần Xây dựng một phương pháp thay thế và Trường hợp sử dụng mà nó hữu ích:

  • Trừ 1 ngày kể từ ngày hiện tại:
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=-1)  # Here, I am adding a negative timedelta
  • Hữu ích trong trường hợp , Nếu bạn muốn thêm 5 ngày và trừ 5 giờ so với thời gian hiện tại. tức là 5 ngày kể từ bây giờ nhưng ít hơn 5 giờ là gì?
from datetime import datetime, timedelta
print datetime.now() + timedelta(days=5, hours=-5)

Nó có thể được sử dụng tương tự với các tham số khác, ví dụ giây, tuần, v.v.


8

Ngoài ra chỉ là một chức năng hay khác mà tôi muốn sử dụng khi tôi muốn tính toán tức là ngày đầu tiên / ngày cuối cùng của tháng trước hoặc các mốc thời gian tương đối khác, v.v ...

Hàm relativingelta từ hàm dateutil (một phần mở rộng mạnh mẽ cho lib datetime)

import datetime as dt
from dateutil.relativedelta import relativedelta
#get first and last day of this and last month)
today = dt.date.today()
first_day_this_month = dt.date(day=1, month=today.month, year=today.year)
last_day_last_month = first_day_this_month - relativedelta(days=1)
print (first_day_this_month, last_day_last_month)

>2015-03-01 2015-02-28

7

Mô-đun mũi tên gen tồn tại

import arrow
utc = arrow.utcnow()
utc_yesterday = utc.shift(days=-1)
print(utc, '\n', utc_yesterday)

đầu ra:

2017-04-06T11:17:34.431397+00:00 
 2017-04-05T11:17:34.431397+00:00
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.