我正在使用datetime Python模块.我想计算从当前日期起6个月的日期.有人可以给我一点帮助吗?
我想要从当前日期起6个月生成日期的原因是生成审核日期.如果用户将数据输入系统,则其审核日期为自输入数据之日起6个月.
Mah*_*dra 941
我发现这个解决方案很好.(这使用python-dateutil扩展名)
from datetime import date
from dateutil.relativedelta import relativedelta
six_months = date.today() + relativedelta(months=+6)
Run Code Online (Sandbox Code Playgroud)
这种方法的优点是它可以处理28,30,31天等问题.这在处理业务规则和方案(比如发票生成等)时非常有用.
$ date(2010,12,31)+relativedelta(months=+1)
datetime.date(2011, 1, 31)
$ date(2010,12,31)+relativedelta(months=+2)
datetime.date(2011, 2, 28)
Run Code Online (Sandbox Code Playgroud)
var*_*tec 50
那么,这取决于您从当前日期起6个月的意思.
使用自然月份:
(day, month, year) = (day, (month+6)%12, year+(month+6)/12)
Run Code Online (Sandbox Code Playgroud)使用银行家的定义,6*30:
date += datetime.timedelta(6*30)
Run Code Online (Sandbox Code Playgroud)Arp*_*ini 23
Python 可以使用 datautil 包来实现这一点,请参见下面的示例
不仅限于此,您还可以同时传递日、月和年的组合。
import datetime
from dateutil.relativedelta import relativedelta
# subtract months
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_months = proc_dt + relativedelta(months=-3)
print(proc_dt_minus_3_months)
# add months
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_months = proc_dt + relativedelta(months=+3)
print(proc_dt_plus_3_months)
# subtract days:
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_days = proc_dt + relativedelta(days=-3)
print(proc_dt_minus_3_days)
# add days days:
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_days = proc_dt + relativedelta(days=+3)
print(proc_dt_plus_3_days)
# subtract years:
proc_dt = datetime.date(2021,8,31)
proc_dt_minus_3_years = proc_dt + relativedelta(years=-3)
print(proc_dt_minus_3_years)
# add years:
proc_dt = datetime.date(2021,8,31)
proc_dt_plus_3_years = proc_dt + relativedelta(years=+3)
print(proc_dt_plus_3_years)
Run Code Online (Sandbox Code Playgroud)
结果:
2021-05-31
2021-11-30
2021-08-28
2021-09-03
2018-08-31
2024-08-31
Luk*_*ina 18
使用Python 3.x,您可以这样做:
from datetime import datetime, timedelta
from dateutil.relativedelta import *
date = datetime.now()
print(date)
# 2018-09-24 13:24:04.007620
date = date + relativedelta(months=+6)
print(date)
# 2019-03-24 13:24:04.007620
Run Code Online (Sandbox Code Playgroud)
但是你需要安装python-dateutil模块:
pip install python-dateutil
Run Code Online (Sandbox Code Playgroud)
小智 17
对于月初计算的开始:
from datetime import timedelta
from dateutil.relativedelta import relativedelta
end_date = start_date + relativedelta(months=delta_period) + timedelta(days=-delta_period)
Run Code Online (Sandbox Code Playgroud)
Joh*_*iss 14
你是什么意思'6个月'.是2009-02-13 + 6个月== 2009-08-13还是2009-02-13 + 6*30天?
import mx.DateTime as dt
#6 Months
dt.now()+dt.RelativeDateTime(months=6)
#result is '2009-08-13 16:28:00.84'
#6*30 days
dt.now()+dt.RelativeDateTime(days=30*6)
#result is '2009-08-12 16:30:03.35'
Run Code Online (Sandbox Code Playgroud)
有关更多信息mx.DateTime
小智 14
此解决方案适用于12月,本页面上的大多数答案都没有.在使用模数(%)或整数除法(//)之前,您需要先将月份从基数1(即Jan = 1)转移到基数0(即Jan = 0),否则11月(11)加1个月会给出12 ,当找到余数(12%12)给出0.
(并且不建议"(月%12)+ 1"或10月+ 1 = 12月!)
def AddMonths(d,x):
newmonth = ((( d.month - 1) + x ) % 12 ) + 1
newyear = d.year + ((( d.month - 1) + x ) / 12 )
return datetime.date( newyear, newmonth, d.day)
Run Code Online (Sandbox Code Playgroud)
但是......这并没有像1月31日+一个月那样解决问题.所以我们回到OP - 添加一个月是什么意思?一个解决方案是回溯直到你到达有效的一天,因为大多数人会认为jan的最后一天,加上一个月,等于2月的最后一天.这也将在负数月份工作.证明:
>>> import datetime
>>> AddMonths(datetime.datetime(2010,8,25),1)
datetime.date(2010, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),4)
datetime.date(2010, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),5)
datetime.date(2011, 1, 25)
>>> AddMonths(datetime.datetime(2010,8,25),13)
datetime.date(2011, 9, 25)
>>> AddMonths(datetime.datetime(2010,8,25),24)
datetime.date(2012, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-1)
datetime.date(2010, 7, 25)
>>> AddMonths(datetime.datetime(2010,8,25),0)
datetime.date(2010, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-12)
datetime.date(2009, 8, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-8)
datetime.date(2009, 12, 25)
>>> AddMonths(datetime.datetime(2010,8,25),-7)
datetime.date(2010, 1, 25)>>>
Run Code Online (Sandbox Code Playgroud)
dan*_*man 13
所以,这里有一个例子dateutil.relativedelta
,我发现它有用于迭代过去一年,每次跳过一个月到现在的日期:
>>> import datetime
>>> from dateutil.relativedelta import relativedelta
>>> today = datetime.datetime.today()
>>> month_count = 0
>>> while month_count < 12:
... day = today - relativedelta(months=month_count)
... print day
... month_count += 1
...
2010-07-07 10:51:45.187968
2010-06-07 10:51:45.187968
2010-05-07 10:51:45.187968
2010-04-07 10:51:45.187968
2010-03-07 10:51:45.187968
2010-02-07 10:51:45.187968
2010-01-07 10:51:45.187968
2009-12-07 10:51:45.187968
2009-11-07 10:51:45.187968
2009-10-07 10:51:45.187968
2009-09-07 10:51:45.187968
2009-08-07 10:51:45.187968
Run Code Online (Sandbox Code Playgroud)
和其他答案一样,你必须在"6个月后"找出你的真正含义.如果你的意思是"未来六个月的今天这个月",那么这样做:
datetime.datetime.now() + relativedelta(months=6)
Run Code Online (Sandbox Code Playgroud)
Mik*_*ies 12
我知道这已经有6个月了,但是如果你要添加一个月,谷歌的答案显示"在python中增加几个月":
import calendar
date = datetime.date.today() //Or your date
datetime.timedelta(days=calendar.monthrange(date.year,date.month)[1])
Run Code Online (Sandbox Code Playgroud)
这将计算当前月份的天数,并将它们添加到当前日期,使用365/12,如果您的迭代超过日期,则一年中的1/12会导致短/长月问题.
rpa*_*nai 12
这并没有回答具体问题(datetime
仅使用),但是,鉴于其他人建议使用不同的模块,这里有一个使用pandas
.
import datetime as dt
import pandas as pd
date = dt.date.today() - \
pd.offsets.DateOffset(months=6)
print(date)
2019-05-04 00:00:00
Run Code Online (Sandbox Code Playgroud)
在闰年按预期工作
date = dt.datetime(2019,8,29) - \
pd.offsets.DateOffset(months=6)
print(date)
2019-02-28 00:00:00
Run Code Online (Sandbox Code Playgroud)
kmk*_*lan 11
import datetime
print (datetime.date.today() + datetime.timedelta(6*365/12)).isoformat()
Run Code Online (Sandbox Code Playgroud)
只需使用timetuple方法提取月份,添加月份并构建新的日期对象.如果有一个已经存在的方法,我不知道.
import datetime
def in_the_future(months=1):
year, month, day = datetime.date.today().timetuple()[:3]
new_month = month + months
return datetime.date(year + (new_month / 12), (new_month % 12) or 12, day)
Run Code Online (Sandbox Code Playgroud)
API有点笨拙,但作为一个例子.显然也不会像2008-01-31 + 1个月那样在角落案件上工作.:)
使用Python标准库,即没有dateutil
或其他人,并解决'2月31日'问题:
import datetime
import calendar
def add_months(date, months):
months_count = date.month + months
# Calculate the year
year = date.year + int(months_count / 12)
# Calculate the month
month = (months_count % 12)
if month == 0:
month = 12
# Calculate the day
day = date.day
last_day_of_month = calendar.monthrange(year, month)[1]
if day > last_day_of_month:
day = last_day_of_month
new_date = datetime.date(year, month, day)
return new_date
Run Code Online (Sandbox Code Playgroud)
测试:
>>>date = datetime.date(2018, 11, 30)
>>>print(date, add_months(date, 3))
(datetime.date(2018, 11, 30), datetime.date(2019, 2, 28))
>>>print(date, add_months(date, 14))
(datetime.date(2018, 12, 31), datetime.date(2020, 2, 29))
Run Code Online (Sandbox Code Playgroud)
一个快速建议是箭头
pip 安装箭头
>>> import arrow
>>> arrow.now().date()
datetime.date(2019, 6, 28)
>>> arrow.now().shift(months=6).date()
datetime.date(2019, 12, 28)
Run Code Online (Sandbox Code Playgroud)
小智 5
我有一个更好的方法来解决“ 2月31日”问题:
def add_months(start_date, months):
import calendar
year = start_date.year + (months / 12)
month = start_date.month + (months % 12)
day = start_date.day
if month > 12:
month = month % 12
year = year + 1
days_next = calendar.monthrange(year, month)[1]
if day > days_next:
day = days_next
return start_date.replace(year, month, day)
Run Code Online (Sandbox Code Playgroud)
我认为它也可以使用负数(减去数月),但是我还没有对此进行太多测试。
Dev*_*rre -6
使用 python datetime 模块将六个月的时间增量添加到 datetime.today() 。
\n\nhttp://docs.python.org/library/datetime.html
\n\n你当然要解决Johannes Wei\xc3\x9f提出的问题——6个月是什么意思?
\n 归档时间: |
|
查看次数: |
344354 次 |
最近记录: |