我想通過從下個月的nth
日減去今天的日期來獲得日期delta
。如何在Python中找到下個月的第n天?
delta = nth_of_next_month - todays_date
print delta.days
你如何獲得的第一個Date對象(或第二,第三..第n)下個月的日子。我試着從日期對象中獲取月份數並將其增加1.這顯然是一個愚蠢的想法,因爲12 + 1 = 13。我也嘗試在今天增加一個月並試圖到達本月的第一個月。我確信有一個更有效的方法來做到這一點。
我想通過從下個月的nth
日減去今天的日期來獲得日期delta
。如何在Python中找到下個月的第n天?
delta = nth_of_next_month - todays_date
print delta.days
你如何獲得的第一個Date對象(或第二,第三..第n)下個月的日子。我試着從日期對象中獲取月份數並將其增加1.這顯然是一個愚蠢的想法,因爲12 + 1 = 13。我也嘗試在今天增加一個月並試圖到達本月的第一個月。我確信有一個更有效的方法來做到這一點。
的dateutil
庫是這個有用的:
from dateutil.relativedelta import relativedelta
from datetime import datetime
# Where day is the day you want in the following month
dt = datetime.now() + relativedelta(months=1, day=20)
http://labix.org/python-dateutil#head-6a1472b7c74e5b8bab7784f11214250d34e09aa5解釋發生在relativedelta –
除非我失去了你的問題這個東西應該是簡單的:
import datetime
now = datetime.datetime.now()
nth_day = 5
next_month = now.month + 1 if now.month < 12 else 1 # February
year = now.year if now.month < 12 else now.year+1
nth_of_next_month = datetime.datetime(year, next_month, nth_day)
print(nth_of_next_month)
結果:
2014-02-05 00:00:00
使用dateutil
作爲另一個答案建議是比這更好的主意,雖然。
另一種替代方法是使用delorean庫:
德洛雷安是提供容易且方便的日期時間 轉換Python中的庫。
>>> from delorean import Delorean
>>> d = Delorean()
>>> d.next_month()
Delorean(datetime=2014-02-15 18:51:14.325350+00:00, timezone=UTC)
>>> d.next_month().next_day(2)
Delorean(datetime=2014-02-17 18:51:14.325350+00:00, timezone=UTC)
尼斯庫,設計與用戶的想法。 –
我的方法來計算下一個月沒有外部庫:
def nth_day_of_next_month(dt, n):
return dt.replace(
year=dt.year + (dt.month // 12), # +1 for december, +0 otherwise
month=(dt.month % 12) + 1, # december becomes january
day=n)
這同時適用於datetime.datetime()
和datetime.date()
對象。
演示:
>>> import datetime
>>> def nth_day_of_next_month(dt, n):
... return dt.replace(year=dt.year + (dt.month // 12), month=(dt.month % 12) + 1, day=n)
...
>>> nth_day_of_next_month(datetime.datetime.now(), 4)
datetime.datetime(2014, 2, 4, 19, 20, 51, 177860)
>>> nth_day_of_next_month(datetime.date.today(), 18)
datetime.date(2014, 2, 18)
不使用任何外部庫,這可以如下
from datetime import datetime, timedelta
def nth_day_of_next_month(n):
today = datetime.now()
next_month_dt = today + timedelta(days=32-today.day)
return next_month_dt.replace(day=n)
我想像所有你需要做的就是增加日期對象的月份財產achived。這個以前的答案顯示,因爲月屬性不可寫http://stackoverflow.com/a/4131114/333082 – cecilphillip
爲什麼你在乎這裏「更高效」?陽光答案中顯而易見的簡單實現只需0.46us即可完成所有這些「昂貴」的工作,相比之下,1.64us可稱爲now()。所以我非常懷疑它會成爲你代碼中的瓶頸。最簡單的實現 - 您瞭解並且可以輕鬆調試 - 比最快的實現要好,除非它影響您的總運行時間。 – abarnert
@abarnert正是我的意思......對我有效。沒有計算能力。 – Johnston