преобразование строки 'yyyy-mm-dd' в datetime python

У меня есть необработанный ввод от пользователя, например «2015-01-30» ... для запроса, который я использую, дата должна быть введена как строка типа «гггг-мм-дд».

Я хотел бы увеличить дату на 1 месяц в конце цикла, s.t «2015-01-30» становится «2015-02-27» (в идеале, последний рабочий день следующего месяца). Я надеялся, что кто-нибудь сможет мне помочь; Я использую PYTHON, причина, по которой я хочу преобразовать в datetime, заключается в том, что я нашел функцию для добавления 1 месяца.

В идеале мне нужно ответить на два вопроса (на Python):

1) как преобразовать строку «гггг-мм-дд» в дату и время Python и преобразовать обратно в строку после применения функции timedelta

2) И / или как добавить 1 месяц к строке «гггг-мм-дд»


person Udaya Tenneti    schedule 21.04.2015    source источник
comment
Пожалуйста, задавайте только один вопрос на каждый вопрос. Ответ на первый вопрос можно найти здесь.   -  person wallyk    schedule 21.04.2015
comment
Быстрый ответ: datetime.datetime.strptime(string, "%Y-%m-%d").date()   -  person Flimm    schedule 08.04.2021


Ответы (4)


Вы можете использовать однострочник, который принимает 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)
person A.J. Uppal    schedule 21.04.2015
comment
ты знаешь, как я могу узнать последний рабочий день месяца? - person Udaya Tenneti; 21.04.2015
comment
@ udaya-tenneti Можно задать другой вопрос. - person tommy.carstensen; 21.04.2015
comment
@ tommy.carstensen согласился. Пожалуйста, не объединяйте несколько вопросов в один пост. - person A.J. Uppal; 22.04.2015

Может быть, эти примеры помогут вам понять:

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)

Это вернет вам первый рабочий день месяца и количество дней в месяце.
С помощью этого вы можете рассчитать, какой был последний рабочий день месяца.
Подробнее об этом: Ссылка
Также есть посмотрите здесь, посмотрите, что вы могли бы использовать: Ссылка

person Tenzin    schedule 21.04.2015
comment
ты знаешь, как я могу узнать последний рабочий день месяца? - person Udaya Tenneti; 21.04.2015
comment
Добавляем еще один пример. - person Tenzin; 21.04.2015

преобразование строки 'yyyy-mm-dd' в _1 _ / _ 2_ 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

Без учета праздников.

person jfs    schedule 21.04.2015
comment
Это должен быть принятый ответ. - person SexyBeast; 10.06.2016

Чтобы преобразовать строку этого формата в объект даты 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 можно легко преобразовать в строку 'ГГГГ-ММ-ДД':

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)
person chucksmash    schedule 21.04.2015
comment
ты знаешь, как я могу узнать последний рабочий день месяца? - person Udaya Tenneti; 21.04.2015
comment
@UdayaTenneti Как в последнюю пятницу месяца или в последнюю пятницу / нерабочий месяц? Я отредактирую свой ответ, включив в него первое; Я полагаю, что для последнего вам нужно будет либо использовать сторонний пакет, либо дать себе возможность указать праздники в вашем регионе. - person chucksmash; 21.04.2015