将字符串 'yyyy-mm-dd' 转换为日期时间

44

我从用户那里得到了一个原始输入,例如 "2015-01-30" ... 对于我正在使用的查询,日期必须作为字符串输入,例如 "yyyy-mm-dd"。

我想在循环结束时将日期增加1个月,使"2015-01-30"变成"2015-02-27"(最好是下一个月的最后一个工作日)。 我希望有人能帮助我;我正在使用PYTHON,我想将其转换为datetime的原因是我找到了一个添加1个月的函数。

理想情况下,我的两个问题需要回答(在Python中):

1)如何将字符串“yyyy-mm-dd”转换为python datetime并在应用timedelta函数后转换回字符串

2)和/或如何将1个月添加到字符串“yyyy-mm-dd”


2
请每个问题只提一个问题。第一个问题的答案在这里回答了。 - wallyk
2
快速答案是:datetime.datetime.strptime(string, "%Y-%m-%d").date() - Flimm
第二个快速答案:date.fromisoformat('2019-12-04')文档 - Flimm
4个回答

36

也许这些例子可以帮助你了解:

from dateutil.relativedelta import relativedelta
import datetime

date1 = datetime.datetime.strptime("2015-01-30", "%Y-%m-%d").strftime("%d-%m-%Y")
print(date1)

today = datetime.date.today()
print(today)
addMonths = relativedelta(months=3)
future = today + addMonths
print(future) 

如果您导入datetime,将会给您在管理日期和时间变量方面提供更多的选项。
在我上面的示例中,我有一些演示代码,可以向您展示它的工作原理。

如果您想要向某个日期添加x天、月或年,它也非常有用。

编辑: 为了回答您在此帖子下面的问题,我建议您查看“日历”。

例如:

import calendar 
january2012 = calendar.monthrange(2002,1)
print(january2012)
february2008 = calendar.monthrange(2008,2)
print(february2008)

这个函数会返回本月份的第一个工作日以及本月份的天数。
有了这些信息,您可以计算出本月份的最后一个工作日。
此处提供更多相关信息:链接
同时,您还可以参考这里的内容,看看是否可能对您有用:链接


1
你知道我怎么能获取月份的最后一个工作日吗? - Udaya Tenneti
添加另一个示例。 - Tenzin

21

如何将字符串 'yyyy-mm-dd' 转换为 datetime/date 类型的 Python 变量

from datetime import date

date_string = '2015-01-30'
now = date(*map(int, date_string.split('-')))
# or now = datetime.strptime(date_string, '%Y-%m-%d').date()

下个月的最后一个工作日

from datetime import timedelta

DAY = timedelta(1)
last_bday = (now.replace(day=1) + 2*31*DAY).replace(day=1) - DAY
while last_bday.weekday() > 4: # Sat, Sun
    last_bday -= DAY
print(last_bday)
# -> 2015-02-27

它不考虑假期。


10

您可以使用一行代码,它接受 datetime,加上一个月(使用定义的函数),然后转换回字符串:

x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")

>>> import datetime, calendar
>>> x = "2015-01-30"
>>> x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")
>>> x
'2015-02-28'
>>> 

add_months

def add_months(sourcedate,months):
    month = sourcedate.month - 1 + months
    year = sourcedate.year + month / 12
    month = month % 12 + 1
    day = min(sourcedate.day,calendar.monthrange(year,month)[1])
    return datetime.date(year,month,day)

你知道我怎么能获取月份的最后一个工作日吗? - Udaya Tenneti
2
@udaya-tenneti 你可以问另一个问题。 - tommy.carstensen
1
@tommy.carstensen同意。请不要将多个问题合并为一个帖子。 - A.J. Uppal

1
将那种格式的字符串转换为Python日期对象:
In [1]: import datetime

In [2]: t = "2015-01-30"

In [3]: d = datetime.date(*(int(s) for s in t.split('-')))

In [4]: d
Out[4]: datetime.date(2015, 1, 30)

要前进到下个月的最后一天,请使用以下代码:

In [4]: d
Out[4]: datetime.date(2015, 1, 30)

In [5]: new_month = (d.month + 1) if d.month != 12 else 1

In [6]: new_year = d.year if d.month != 12 else d.year + 1

In [7]: import calendar

In [8]: new_day = calendar.monthrange(new_year, new_month)[1]

In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)

In [10]: d
Out[10]: datetime.date(2015, 2, 28)

这个 datetime.date 对象可以很容易地转换为一个 'YYYY-MM-DD' 字符串:

In [11]: str(d)
Out[11]: '2015-02-28'

编辑:

获取月份中的最后一个工作日(即周一至周五):

In [8]: new_day = calendar.monthrange(new_year, new_month)[1]

In [9]: d = d.replace(year=new_year,month=new_month,day=new_day)

In [10]: day_of_the_week = d.isoweekday()

In [11]: if day_of_the_week > 5:
   ....:     adj_new_day = new_day - (day_of_the_week - 5)
   ....:     d = d.replace(day=adj_new_day)
   ....:

In [11]: d
Out[11]: datetime.date(2015, 2, 27)

你知道我怎么能获取月份的最后一个工作日吗? - Udaya Tenneti
@UdayaTenneti 是指月末的最后一个星期五还是非假日的最后一个星期五?我会编辑我的答案以包括前者;对于后者,我想你需要使用第三方软件包或者给自己提供一种指定本地节假日的方法。 - chucksmash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接