2009-10-25 65 views
40

Làm cách nào để tìm ngày của ngày Thứ Hai trước đó, dựa trên ngày hiện tại bằng cách sử dụng Python? Tôi nghĩ có lẽ tôi có thể sử dụng: datetime.weekday() để làm điều đó, nhưng tôi đang gặp khó khăn.Tìm ngày của Thứ Hai bằng Python

Tôi về cơ bản muốn tìm ngày hôm nay và ngày thứ Hai để xây dựng truy vấn phạm vi ngày trong django bằng cách sử dụng: created__range=(start_date, end_date).

+0

Thứ Hai hoặc thứ Hai vừa qua? –

+0

Tôi đang tìm kiếm Thứ Hai trước đây – Joe

Trả lời

106
>>> import datetime 
>>> today = datetime.date.today() 
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1) 
datetime.date(2009, 10, 26) 

Một số lời giải thích:

Đưa những ngày todays. Trừ số ngày đã trôi qua trong tuần này (điều này giúp bạn 'cuối cùng' thứ hai). Thêm một tuần.

Sửa: Trên đây là cho 'thứ hai tiếp theo', nhưng kể từ khi bạn đang tìm kiếm cho 'thứ hai cuối cùng' bạn có thể sử dụng

today - datetime.timedelta(days=today.weekday()) 
+4

Python thật tuyệt vời :) Điều này rất khó và không tầm thường trong hầu hết các ngôn ngữ khác. –

+0

Không thực sự trả lời câu hỏi dành cho thứ hai cuối cùng không phải thứ hai tuần sau –

+2

@GeraldKaszuba thực sự dễ dàng hơn và dễ đọc hơn trong PHP: 'DateTime mới (" thứ hai tuần trước ")' hoặc 'strtotime (" thứ hai tuần trước ")'. – JustAC0der

0

Sử dụng timedeltas và mô-đun datetime:

import datetime 
datetime.date.today()+datetime.timedelta(days=-datetime.date.today().weekday()) 
0
d = datetime.datetime.today().weekday() 

cung cấp cho bạn ngày hôm nay trong tuần, đếm 0 (thứ hai) đến 6 (chủ nhật)

datetime.datetime.today() + datetime.timedelta(days=(7-d)%7) 

(7-d)% 7 mang đến cho bạn ngày cho đến khi Thứ hai, hoặc để lại cho bạn bạn đang ở đâu nếu hôm nay là Thứ Hai

8

Lưu ý: Các OP nói trong các ý kiến, "tôi đang tìm kiếm quá khứ thứ hai ". Tôi lấy điều này để có nghĩa là chúng tôi đang tìm kiếm thứ hai cuối cùng đã xảy ra nghiêm ngặt trước ngày hôm nay.

Tính toán hơi khó khăn khi chỉ sử dụng mô-đun datetime (đặc biệt với cách giải thích ở trên "Thứ Hai vừa qua" và nếu bạn muốn tránh clunky if-statements). Ví dụ, nếu today là Thứ Hai như 2013-12-23,

today - DT.timedelta(days=today.weekday()) 

lợi nhuận 2013-12-23, đó là cùng một ngày như today (không phải là quá khứ Thứ Hai).

Lợi thế của việc sử dụng dateutil module là bạn không phải thực hiện các tính toán tinh thần khó khăn cũng như buộc người đọc phải làm như vậy để có được ngày phù hợp. dateutil sẽ làm tất cả cho bạn:

import dateutil.relativedelta as rdelta 
import datetime as DT 

today = DT.date(2013, 12, 23) # Monday 

past_monday = today + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1)) 
print(past_monday) 
# 2013-12-16 

next_monday = today + rdelta.relativedelta(days=1, weekday=rdelta.MO(+1)) 
print(next_monday) 
# 2013-12-30 

Lưu ý rằng days=-1 là cần thiết để đảm bảo rằng past_monday là một ngày khác với today.

+0

Bạn đang sử dụng công cụ dễ dàng theo cách khó khăn;) – diegueus9

32

Bài đăng của ChristopheD gần với nội dung bạn muốn.Tôi không có đủ đại diện để thực hiện một bình luận :(

Thay vì (mà thực sự mang đến cho bạn thứ hai sắp tới tiếp theo):

 
>>> today + datetime.timedelta(days=-today.weekday(), weeks=1) 
datetime.date(2009, 10, 26) 

tôi sẽ nói:

 
>>> last_monday = today - datetime.timedelta(days=today.weekday()) 

Nếu bạn muốn tuần trước, hãy thêm thông số 'tuần = 1'.

Điều này làm cho mã dễ đọc hơn vì bạn đang trừ một dấu thời gian. Điều này sẽ xóa mọi nhầm lẫn gây ra bằng cách thêm dấu thời gian có âm và bù dương.

+1

+1 cho nhận xét cá nhân trong tương lai của bạn! – physicsmichael

+4

Whooohooo, tôi có thể bình luận ngay bây giờ! Cảm ơn. –

18

Tôi nghĩ rằng cách dễ nhất là sử dụng python-dateutil như thế này:

from datetime import date 
from dateutil.relativedelta import relativedelta, MO 

today = date.today() 
last_monday = today + relativedelta(weekday=MO(-1)) 
print last_monday 
1

Bạn có thể sử dụng Natty. Tôi đã thử parsedatetimedateparser. So sánh ba điều này, tôi nghĩ rằng Natty là tốt nhất.

Để có được kết quả của bạn, sử dụng như thế này:

>>> from natty import DateParser 
>>> dp = DateParser('last monday') 
>>> dp.result() 
[datetime.datetime(2016, 8, 1, 17, 35, 5, tzinfo=tzlocal())] #Today is 9th of August 2016 5.35 PM 

Github Link: https://github.com/eadmundo/python-natty

Hãy thử nó, Nó có thể làm nhiều hơn nữa!

0

Đối với những người dùng chương trình tương lai xuất hiện trên trang này tìm cách nhận "Chủ nhật gần đây nhất", thay vì "Thứ Hai gần đây nhất", bạn cần thực hiện thêm một số phép tính vì datetime.weekday() xử lý thứ hai như ngày đầu tiên của tuần:

today = datetime.date.today() 
weekday = today.weekday() + 1 
start_day = today - datetime.timedelta(days=weekday % 7) 

Nếu hôm nay là thứ ba, điều này đặt ra start_day đến chủ nhật vừa qua. Nếu hôm nay là Chủ Nhật, bộ này sẽ đặt start_day thành hôm nay. Hãy lấy đi % 7 nếu bạn muốn "Chủ nhật tuần trước" được một tuần trước nếu hôm nay là Chủ Nhật.

Các vấn đề liên quan