2016-09-03 7 views
0

datetime.strptimeリファレンスでは、YYYY-Qx(x = {1、...、4})日付形式のオプションは提供されていません。それにはdateutil.parserが必要ですか?YYYY-Q文字列からdatetimeオブジェクトを取得するにはどうすればよいですか?

私の実装では、2番目の月の15日を代表日として選択しました。つまり、この関数が日付として "2016-Q3"を受け取った場合、それは "2016-08-15"に解決されます。

def df_quarter(self, date): 
    ypart = datetime.datetime.strptime(date.split('-')[0], '%Y') 
    qpart = re.sub('Q', '', date.split('-')[1]) 
    qmid = 2+3*(int(qpart)-1) 
    if qmid < 10: 
     qmid = "0" + str(qmid) 
    date = str(ypart.year) + '-' + qmid + '-15' 

答えて

0

あなたは、単にハードコードは、四半期と日付の間の関係ができ、適切な値でQ(\d)を置き換えるためにre.subを使用します。

import re 
def df_quarter(date): 
    q = {'1':'02-15', '2':'05-15', '3':'08-15', '4':'11-15'} 
    return re.sub('Q(\d)', lambda match, q=q: q[match.group(1)], date) 

In [36]: df_quarter('2016-Q1') 
Out[36]: '2016-02-15' 

In [35]: df_quarter('2016-Q2') 
Out[35]: '2016-05-15' 

In [34]: df_quarter('2016-Q3') 
Out[34]: '2016-08-15' 

In [37]: df_quarter('2016-Q4') 
Out[37]: '2016-11-15' 

あるいは、もしdf_quarterdatetime.datetimeオブジェクトを返すようにします。

import re 
import datetime as DT 
def df_quarter(date): 
    q = {'1':'02-15', '2':'05-15', '3':'08-15', '4':'11-15'} 
    date = re.sub('Q(\d)', lambda match, q=q: q[match.group(1)], date) 
    return DT.datetime.strptime(date, '%Y-%m-%d') 

するのではなく、あなたが代わりに2桁の文字列で

def df_quarter(date): 
    date = re.sub('Q(\d)', lambda match: '{:02d}-15'.format(int(match.group(1))*3-1), date) 
    return DT.datetime.strptime(date, '%Y-%m-%d') 

書式指定子02dが整数に取って代わることに注意してください、int(match.group(1))*3-1を使用することができ、式に基づいて、月を計算たい場合必要であれば左に0を埋め込む。

+0

ありがとうございます。ああ、私は輸入を忘れてしまった。ごめんなさい。 – slatenf

+0

はい、3番目のオプションは非常に甘いです!私は2番目を実装します。 – slatenf

関連する問題