Một cách sang trọng để cắt ngắn một đối tượng datetime python là gì?
Trong trường hợp cụ thể này, đến ngày. Vì vậy, về cơ bản thiết lập giờ, phút, giây và micro giây thành 0.
Tôi muốn đầu ra cũng là một đối tượng datetime, không phải là một chuỗi.
Một cách sang trọng để cắt ngắn một đối tượng datetime python là gì?
Trong trường hợp cụ thể này, đến ngày. Vì vậy, về cơ bản thiết lập giờ, phút, giây và micro giây thành 0.
Tôi muốn đầu ra cũng là một đối tượng datetime, không phải là một chuỗi.
Câu trả lời:
Tôi nghĩ rằng đây là những gì bạn đang tìm kiếm ...
>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)
Nhưng nếu bạn thực sự không quan tâm đến khía cạnh thời gian của mọi thứ, thì bạn thực sự chỉ nên đi xung quanh date
các vật thể ...
>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)
datetime
, không phải date
đối tượng (mà bạn có thể nhận được bằng cách sử dụng dt.date()
cuộc gọi (không cần sử dụng hàm tạo rõ ràng)). Các .replace()
phương pháp có thể thất bại nếu datetime
bổ sung hỗ trợ nano giây . Bạn có thể sử dụng datetime.combine()
thay thế .
datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?
Sử dụng date
không datetime
nếu bạn không quan tâm đến thời gian.
>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)
Bạn có thể cập nhật một datetime như thế này:
>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)
replace
Tôi biết câu trả lời được chấp nhận từ bốn năm trước hoạt động, nhưng điều này có vẻ nhẹ hơn so với sử dụng replace
:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
Ghi chú
datetime
đối tượng mà không chuyển các thuộc tính thời gian cho hàm tạo, bạn sẽ nhận được nửa đêm.dt = datetime.datetime.now()
Bạn không thể cắt một đối tượng datetime vì nó là bất biến .
Tuy nhiên, đây là một cách để xây dựng một datetime mới với các trường 0 giờ, phút, giây và micro giây, mà không cần bỏ đi ngày ban đầu hoặc tzinfo:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
replace
tùy chọn lên hàng đầu, vì đó có thể là những gì họ muốn.
tzinfo=now.tzinfo
. Vào tzinfo
lúc nửa đêm có thể khác nhau, ví dụ, bù utc vào lúc 2012-04-01 00:09:00
(9 giờ sáng) ở múi giờ Úc / Melbourne AEST+10:00
nhưng AEDT+11:00
vào lúc 2012-04-01 00:00:00
(nửa đêm) - có sự chuyển tiếp cuối DST vào ngày đó. Bạn có thể sử dụng pytz
mô-đun để sửa nó, xem câu trả lời của tôi.
Để có được một nửa đêm tương ứng với một đối tượng datetime nhất định, bạn có thể sử dụng datetime.combine()
phương thức :
>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)
Ưu điểm so với các .replace()
phương pháp là datetime.combine()
giải pháp dựa trên sẽ tiếp tục làm việc ngay cả khi datetime
mô-đun giới thiệu nano giây hỗ trợ .
tzinfo
có thể được bảo toàn nếu cần thiết nhưng phần bù utc có thể khác vào nửa đêm, ví dụ, do quá trình chuyển đổi DST và do đó, một giải pháp ngây thơ (cài đặt tzinfo
thuộc tính thời gian) có thể thất bại. Xem Làm thế nào để tôi có được thời gian UTC của nửa đêm nửa đêm cho một múi giờ nhất định?
Bạn có thể sử dụng gấu trúc cho điều đó (mặc dù nó có thể là chi phí cho nhiệm vụ đó). Bạn có thể sử dụng hình tròn , sàn và trần như đối với các số thông thường và bất kỳ tần số gấu trúc nào từ các bí danh bù :
import pandas as pd
import datetime as dt
now = dt.datetime.now()
pd_now = pd.Timestamp(now)
freq = '1d'
pd_round = pd_now.round(freq)
dt_round = pd_round.to_pydatetime()
print(now)
print(dt_round)
"""
2018-06-15 09:33:44.102292
2018-06-15 00:00:00
"""
Bạn có thể sử dụng datetime.strftime để trích xuất ngày, tháng, năm ...
Thí dụ :
from datetime import datetime
d = datetime.today()
# Retrieves the day and the year
print d.strftime("%d-%Y")
Đầu ra (cho ngày hôm nay):
29-2011
Nếu bạn chỉ muốn lấy lại ngày, bạn có thể sử dụng thuộc tính day như:
from datetime import datetime
d = datetime.today()
# Retrieves the day
print d.day
Ouput (cho ngày hôm nay):
29
d.day
v.v.
Có một thư viện tuyệt vời được sử dụng để thao túng ngày: Delorean
import datetime
from delorean import Delorean
now = datetime.datetime.now()
d = Delorean(now, timezone='US/Pacific')
>>> now
datetime.datetime(2015, 3, 26, 19, 46, 40, 525703)
>>> d.truncate('second')
Delorean(datetime=2015-03-26 19:46:40-07:00, timezone='US/Pacific')
>>> d.truncate('minute')
Delorean(datetime=2015-03-26 19:46:00-07:00, timezone='US/Pacific')
>>> d.truncate('hour')
Delorean(datetime=2015-03-26 19:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('day')
Delorean(datetime=2015-03-26 00:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('month')
Delorean(datetime=2015-03-01 00:00:00-07:00, timezone='US/Pacific')
>>> d.truncate('year')
Delorean(datetime=2015-01-01 00:00:00-07:00, timezone='US/Pacific')
và nếu bạn muốn lấy lại giá trị datetime:
>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)
Xem thêm tại https://pandas.pydata.org/pandas-docs/urdy/reference/api/pandas.Series.dt.floor.html
Bây giờ là năm 2019, tôi nghĩ cách hiệu quả nhất để làm điều đó là:
df['truncate_date'] = df['timestamp'].dt.floor('d')
Bạn chỉ có thể sử dụng
datetime.date.today()
Đó là ánh sáng và trả lại chính xác những gì bạn muốn.
Cắt ngắn có nghĩa là gì?
Bạn có toàn quyền kiểm soát định dạng bằng cách sử dụng phương thức strftime () và sử dụng chuỗi định dạng thích hợp.
http://docs.python.org/l Library / datetime.html # strftime-strptime-behavior
Nếu bạn đang xử lý một Series loại DateTime, có một cách hiệu quả hơn để cắt bớt chúng, đặc biệt khi đối tượng Sê-ri có nhiều hàng.
Bạn có thể sử dụng chức năng sàn
Ví dụ: nếu bạn muốn cắt ngắn nó thành giờ:
Tạo một phạm vi ngày
times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))
Chúng ta có thể kiểm tra nó so sánh thời gian chạy giữa các chức năng thay thế và sàn.
%timeit times.apply(lambda x : x.replace(minute=0, second=0, microsecond=0))
>>> 341 ms ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit times.dt.floor('h')
>>>>2.26 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Đây là một cách khác phù hợp với một dòng nhưng không đặc biệt thanh lịch:
dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())