【问题标题】:Converting string 'yyyy-mm-dd' into datetime [duplicate]将字符串'yyyy-mm-dd'转换为日期时间[重复]
【发布时间】:2015-06-29 00:34:58
【问题描述】:

我有来自用户的原始输入,例如“2015-01-30”...对于我正在使用的查询,日期必须作为字符串输入,例如“yyyy-mm-dd”。

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

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

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

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

【问题讨论】:

  • 每个问题只问一个问题。第一个问题回答here
  • 快速回答是:datetime.datetime.strptime(string, "%Y-%m-%d").date()

标签: python datetime timedelta


【解决方案1】:

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

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 天、月或年添加到某个日期,它也非常有用。

编辑: 要在这篇文章下面回答您的问题,我建议您查看“日历”

例如:

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

这将返回该月的第一个工作日以及该月的天数。
有了它,您可以计算该月的最后一个工作日。
以下是有关它的更多信息:Link
也看看这里,看看你可能会使用什么:Link

【讨论】:

  • 你知道我怎样才能得到这个月的最后一个工作日吗?
  • 添加另一个示例。
【解决方案2】:

将字符串'yyyy-mm-dd'转换成datetime/datepython

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

不考虑节假日。

【讨论】:

    【解决方案3】:

    您可以使用单行代码,它采用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 你可以问另一个问题。
    • @tommy.carstensen 同意。请不要将多个问题合并到一篇文章中。
    【解决方案4】:

    将该格式的字符串转换为 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)
    

    【讨论】:

    • 你知道我怎样才能得到这个月的最后一个工作日吗?
    • @UdayaTenneti 一个月的最后一个星期五还是这个月的最后一个星期五/非节假日?我将编辑我的答案以包括前者;我想对于后者,您需要使用第三方软件包或给自己一种方法来指定您所在地区的假期。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 2014-05-02
    • 2017-05-05
    • 1970-01-01
    • 2021-03-19
    • 2013-03-22
    相关资源
    最近更新 更多