python里转换字符串YYYY-MM-DD为DateTime

converting string 'yyyy-mm-dd' into datetime python

本问题已经有最佳答案,请猛点这里访问。

我有来自用户的原始输入,如"2015-01-30"…对于我使用的查询,必须将日期输入为字符串,如"YYYY-MM-DD"。

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

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

1)如何将字符串"yyyy-mm-dd"转换为python日期时间,并在应用timedelta函数后转换回字符串

2)和/或如何在字符串"yyyy-mm-dd"中添加1个月


也许这些例子可以帮助你得到一个想法:

1
2
3
4
5
6
7
8
9
10
11
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)

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

例如,如果你想在某个日期加上x天、月或年,这也是非常有用的。

编辑:为了回答你在这篇文章下面的问题,我建议你看一下"日历"。

例如:

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

这将返回该月的第一个工作日和该月的天数。这样你就可以计算出这个月最后一个工作日是什么。以下是关于它的更多信息:链接这里还有一个loook,看看你能用什么:link


将字符串"yyyy-mm-dd"转换为datetime/datepython

1
2
3
4
5
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()

下个月的最后一个工作日

1
2
3
4
5
6
7
8
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

它不考虑假期。


您可以使用一个一行程序,它接受datetime,添加一个月(使用定义的函数),并将其转换回字符串:

1
x = add_months(datetime.datetime(*[int(item) for item in x.split('-')]), 1).strftime("%Y-%m-%d")
1
2
3
4
5
6
>>> 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

1
2
3
4
5
6
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)


要将该格式的字符串转换为python日期对象,请执行以下操作:

1
2
3
4
5
6
7
8
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)

转到下个月的最后一天:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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'字符串:

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

编辑:

要获取月份的最后一个工作日(即星期一到星期五),请执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
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)