преобразование строки 'yyyy-mm-dd' в datetime python [дубликат]
этот вопрос уже есть ответ здесь:
- преобразование строки в datetime 18 ответов
У меня есть необработанный ввод, такие как "2015-01-30"...для запроса, который я использую, дата должна быть введена как строка как таковая "гггг-ММ-ДД".
Я хотел бы увеличить дату на 1 месяц в конце моего петли С. Т "2015-01-30" становится "2015-02-27" (в идеале последний рабочий день следующего месяца). Я надеялся, что кто-то может мне помочь; я использую PYTHON, причина, по которой я хочу преобразовать в datetime, - я нашел функцию для добавления 1 месяца.
В идеале мои два вопроса, на которые нужно ответить (в Python):
1) Как преобразовать строку "гггг-ММ-ДД" в Python datetime и преобразовать обратно в строку после применения функции timedelta
2) и/или как добавить 1 месяц строка "гггг-ММ-ДД"
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)
возможно, эти примеры помогут вам получить представление:
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)
это возвращает вам первый рабочий день месяца и количество дней месяца.
С помощью этого вы можете рассчитать, каким был последний рабочий день месяца.
Вот более подробная информация об этом:ссылке
Также есть loook здесь, смотрит, что вы могли бы использовать:ссылке
преобразование строки 'гггг-ММ-ДД' в 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
он не учитывает праздники.
чтобы преобразовать строку этого формата в объект даты 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'
EDIT:
чтобы получить последний рабочий день (т. е. понедельник-пятница) месяца:
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)