web-dev-qa-db-ja.com

文字列「yyyy-mm-dd」を日時に変換python

「2015-01-30」などのユーザーからの生の入力があります...使用しているクエリでは、「yyyy-mm-dd」などの文字列として日付を入力する必要があります。

ループの終わりに1か月ずつ日付を増やしたいs.t「2015-01-30」が「2015-02-27」(理想的には翌月の最終営業日)になります。誰かが私を助けてくれることを望んでいた。 PYTHONを使用していますが、datetimeに変換したいのは、1か月を追加する関数を見つけたからです。

理想的には、答えられる2つの質問は(Pythonで)です。

1)文字列「yyyy-mm-dd」をpython datetimeに変換し、timedelta関数を適用した後に文字列に戻す方法

2)および/または文字列「yyyy-mm-dd」に1か月を追加する方法

15
Udaya Tenneti

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)
4
A.J. Uppal

たぶん、これらの例はあなたがアイデアを得るのに役立つでしょう:

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

13
Tenzin

文字列 '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

休日は考慮されません。

12
jfs

その形式の文字列を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)
0
chucksmash