2017-04-15 22 views
-2

私の全体的なジレンマを説明し、私はPython 2.7を使用しています。Pythonで書かれた日付を日付形式に変換する

私は日付フィールドを持つadbode pdfフォームdocを持っています。私はpdfminer関数を使って値を抽出します。私が解決しなければならない問題は、adobe arcobatリーダーのユーザーは、 "4月3日2017"または "3月4日2017"または "4月3日2017"または "04/04/2017"のような文字列と " 4 3 2017」。 adobeの日付フィールドはmm/dd/yyyy形式に設定されているため、上記のいずれかの値を入力するとpdfminerが実際に値を入力しますが、adobeは04/03/2017と表示しますフィールドをクリックすると、上記のような実際の値が表示されます。 adobeはこれを許可してから、それを変換しています。私はmm/dd/yyyyとして日付を表示すると思います。より多くのコントロールのためにAdobeとjavascriptを使用する能力がありますが、ユーザーはjavascriptファイルを伴わずにPDFフォームを持ち、使うことができません。

だから、上記の例のように書かれた日付をPythonで受け取り、文字列から上記の例を受け入れ、真のmm/dd/yyyy形式に変換できるメソッドを見つけることができましたか?私は長くて短い月の名前を変換するための方法を見たが、第1、第2、第3、第4のような日の名前を扱うものは何もなかった。

答えて

1

可能なフォーマットを順番に試してみることもできます。まず、テスト容易にするために任意のstndrd指定子を削除します。

どちらでしょうディスプレイ
from datetime import datetime 

formats = ["%B %d %Y", "%d %B %Y", "%b %d %Y", "%m/%d/%Y", "%m %d %Y"] 
dates = ["april 3rd 2017", "3rd April 2017", "Apr 3rd 2017", "04/04/2017", "4 3 2017"] 

for date in dates: 
    date = date.lower().replace("rd", "").replace("nd", "").replace("st", "") 

    for format in formats: 
     try: 
      print datetime.strptime(date, format).strftime("%m/%d/%Y") 
     except ValueError: 
      pass 

04/03/2017 
04/03/2017 
04/03/2017 
04/04/2017 
04/03/2017 

このアプローチは、それぞれの日付を検証するという利点があります。たとえば、12ヶ月を超える月などです。許可されているすべてのフォーマットに失敗した日付には、フラグを付けることができます。 @ MartinEvansのanwser、しかしarrowライブラリを使用してに基づいて

+0

うわー、ありがとう、ええ、私は正規表現を見ていた、それを感謝します。いくつかの他の関数があるかどうかはわかりませんでした。私はphythonを初めて使うので、なぜ私は尋ねましたが、正規表現を使うことができます:)クール。 –

+0

あなたのコードだけを入れてテストすると、私はいつも "モジュールオブジェクトには属性 'strptime'がありません。私はdatetime libをインポートしましたか?なぜ私はそれが動作するはずですPythonのドキュメントをチェックしたか分からない。 –

+1

nm :) "datetime import datetimeから";) –

1

文字列から数値を取得する正規表現を作成するだけです。

import re 

s = '30Apr' 
n = s[:re.match(r'[0-9]+', s).span()[1]] 
print(n) # Will print 30 

他のものは簡単にする必要があります。

0

まずインストール(それは日時よりもより多くのケースを処理するので、あなたはreplace()lower()を使用する必要はありませんので)矢印:

pip install arrow 

import arrow 

dates = ['april 3rd 2017', '3rd April 2017', 'Apr 3rd 2017', '04/04/2017', '4 3 2017'] 
formats = ['MMMM Do YYYY', 'Do MMMM YYYY', 'MMM Do YYYY', 'MM/DD/YYYY', 'M D YYYY'] 

def convert_datetime(date): 
    for format in formats: 
     try: 
      print arrow.get(date, format).format('MM/DD/YYYY') 
     except arrow.parser.ParserError: 
      pass 

[convert_datetime(date) for date in dates] 

ウィル出力:

そして、それぞれの可能なフォーマットを試してみてくださいあなたの日付形式で間違っている可能性が何がわからない場合
04/03/2017 
04/03/2017 
04/03/2017 
04/04/2017 
04/03/2017 

、出力することもできます日付のいずれも形式と一致しない場合、素敵なエラーメッセージ:

def convert_datetime(date): 
    for format in formats: 
     try: 
      print arrow.get(date, format).format('MM/DD/YYYY') 
      break 
     except (arrow.parser.ParserError, ValueError) as e: 
      pass 
    else: 
     print 'For date: "{0}", {1}'.format(date, e) 

convert_datetime('124 5 2017') # test invalid date 

ウィル出力次のエラーメッセージを:

'For date: "124 5 2017", month must be in 1..12' 
+0

なぜ私はほとんどが矢印ライブラリを使用するのを恐れているのか分かりません^^ 'とにかく私は試しました...あなたがコミュニティの他のユーザーのためにどんな助けにもなる可能性があります! –

関連する問題