2016-05-23 9 views
9

私は現在の日付が月の25日を過ぎた後、最初の日付変数が最初の日付を保持するかどうかという条件で、Pythonでその月の最初の日を見つけようとしています今月の代わりに次の月の私は次のようにしています:Pythonの月の最初の日を見つける

import datetime 
todayDate = datetime.date.today() 
if (todayDate - todayDate.replace(day=1)).days > 25: 
    x= todayDate + datetime.timedelta(30) 
    x.replace(day=1) 
    print x 
else: 
    print todayDate.replace(day=1) 

これを行うためのクリーンな方法はありますか?

ありがとうございます!

+1

を行うことができます - 。todayDate.replace(日= 1))の日> 25'のみ27日に真となり、ありません26日。言葉で言うことやコードで言うことをしたいのですか? –

+0

そして、あなたは2月の後半に問題に遭遇するかもしれないと私には思われます。 – Matthias

答えて

18

これはぴったりの解決策です。元のコードの例で注意すべき

import datetime 

todayDate = datetime.date.today() 
if todayDate.day > 25: 
    todayDate += datetime.timedelta(7) 
print todayDate.replace(day=1) 

ことの一つは、あなたが1月の最後の日をテストしている場合timedelta(30)を使用してtroubl電子を引き起こすということです。それで私は7日間のデルタを使用しています。

+0

あなたは正しい@ J.F.Sebastianです!それはさっぱりしているので、あなたの提案した変更を加えました。 – andrew

+0

ありがとう@andrew:それも私を助けた.. :) – Harsha

2

dateutilを使用してください。

from datetime import date 
from dateutil.relativedelta import relativedelta 

today = date.today() 
first_day = today.replace(day=1) 
if today.day > 25: 
    print(first_day + relativedelta(months=1)) 
else: 
    print(first_day) 
1

はい、最初に現在の月の開始日を設定します。

2番目のテストが現在の日付> 25で、それに真偽がある場合。 Trueの場合は、月のdatetimeオブジェクトの先頭に1か月を追加します。 falseの場合、datetimeオブジェクトを月の先頭に設定された値で使用します。

import datetime 
from dateutil.relativedelta import relativedelta 

todayDate = datetime.date.today() 
resultDate = todayDate.replace(day=1) 

if ((todayDate - resultDate).days > 25): 
    resultDate = resultDate + relativedelta(months=1) 

print resultDate 
1

arrowモジュールは微妙な間違いからあなたを遠ざけてくれますし、古い製品を使用する方が簡単です。

import arrow 

def cleanWay(oneDate): 
    if currentDate.date().day > 25: 
     return currentDate.replace(months=+1,day=1) 
    else: 
     return currentDate.replace(day=1) 


currentDate = arrow.get('25-Feb-2017', 'DD-MMM-YYYY') 
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY')) 

currentDate = arrow.get('28-Feb-2017', 'DD-MMM-YYYY') 
print (currentDate.format('DD-MMM-YYYY'), cleanWay(currentDate).format('DD-MMM-YYYY')) 

この場合、たとえば、さまざまな月の長さを考慮する必要はありません。このスクリプトの出力は次のとおりです。

25-Feb-2017 01-Feb-2017 
28-Feb-2017 01-Mar-2017 
33

、ところで同じ行にあなたのテスト `todayDate

datetime.date.today().replace(day=1) 
関連する問題