2011-01-06 16 views
2

Stackoverflowの同じ行にいくつか質問がありますが、このケースは異なります。Python:絶対日付スタンプへの相対日付文字列の変換

入力として、私は3つの一般的な形式を取ることができる日付文字列を持っています。 12時間前

私はスクリプト形式を認識し、適切なパラメータを持つ関数を呼び出すことができるようにしたい

a)の2011年1月6日4日前 B) c)のいずれかで。

そうである場合、次いでconvert_full_string( "2011年1月6日")

場合B、次いでconvert_days(4)

場合、C convert_hours Iのフォーマットとできるを認識したら(12)

適切な機能を呼び出すためには、比較的簡単です。私は使用を計画していますdateutil

しかし、私はどのようにフォーマットを認識するか分からない。

コードサンプルのご提案は大変ありがとうございます。

ありがとうございました。

答えて

12

parsedatetimeを使用して、ロジックを自分でコーディングすることなく、datetime.datetimeオブジェクトに3つのすべての日付フォーマットを解析できます。

import parsedatetime.parsedatetime as pdt 
import parsedatetime.parsedatetime_consts as pdc 
import datetime 
c = pdc.Constants() 
p = pdt.Calendar(c) 
for text in ('january 6, 2011', '4 days ago', '12 hours ago'): 
    date=datetime.datetime(*p.parse(text)[0][:6]) 
    # print(date.isoformat()) 
    # 2011-01-06T09:00:18 
    # 2011-01-02T09:00:18 
    # 2011-01-05T21:00:18 
    print(date.strftime('%Y%m%dT%H%M%S')) 
    # 20110106T090208 
    # 20110102T090208 
    # 20110105T210208 
+0

事をかなり単純化するうわー!その図書館についても知らなかった。生のdatetimeオブジェクトを取得する可能性があります。最終的に、私はちょうど日付時刻を次のformateにしたい:20110106T083630 –

+0

@Al Jepo:上の編集されたポストでは、 'date'は' datetime.datetime'オブジェクトです。それはあなたが "raw datetime object"の意味ですか? 'date'はあなたが望む結果に近いisoformatメソッドを持っています。あるいは、正確に取得するために' strftime'メソッドを使うことができます。 – unutbu

+0

すごくおっしゃって...ありがとう!明らかに33.9Kポイントに値する! –

0

あなたが正規表現と一致させることができます:

[0-9]{1,2}日前と同様の
import re 
re.search(r".* [0-9]{1,2}, [0-9]{4}", tomatch) 

など

0
if 'days' in userinput: 
    convert_days(userinput[:userinput.index('days')].strip()) 
elif 'hours' in userinput: 
    convert_hours(userinput[:userinput.index('hours')].strip()) 
else: 
    convert_full_string(userinput) 

これは前提としている「日」または「時間」は、ユーザ入力に含まれている場合、あなたそれらの2つの単語の直前に来た文字を常に必要とします。

+0

ビッグ仮定:「私は一人で数時間を過ごすことができるまで、私は日数えています私の妻 " – bgporter

+1

まあ、OPは書いています: '入力として、私は3つの一般的な形式を取ることができる日付文字列を持っています' ...詩や日記などの記載はありません。 – XORcist

関連する問題