1. ホーム
  2. python

文字列が日付(任意のフォーマット)を持つかどうかをチェックする

2023-07-22 10:06:55

質問

文字列が日付にパースされるかどうかを確認するにはどうすればよいですか?

  • 1990年1月19日
  • 1990 年 1 月 19 日
  • 1990 年 1 月 19 日
  • 01/19/1990
  • 01/19/90
  • 1990
  • 1990年1月
  • 1990年1月

これらはすべて有効な日付です。もし、3番目の項目と上記の最後の項目の間にスペースがないことを懸念しているのであれば、必要であれば、文字/文字と数字の間にスペースを自動的に挿入することで簡単に改善することができます。

その前に、基本的なことを。

の中に入れてみました。 if statement :

if datetime.strptime(item, '%Y') or datetime.strptime(item, '%b %d %y') or datetime.strptime(item, '%b %d %Y')  or datetime.strptime(item, '%B %d %y') or datetime.strptime(item, '%B %d %Y'):

しかし、これはtry-exceptブロックの中にあり、このようなものを返し続けています。

16343 time data 'JUNE1890' does not match format '%Y'

の最初の条件を満たしていなければ if 文の最初の条件を満たしていなければなりません。

明確にするために、私は実際には日付の値を必要としません。理想的には、このようなものだったでしょう。

if item is date:
    print date
else:
    print "Not a date"

何か方法はないでしょうか?

どのように解決するのですか?

この parse の中の関数 dateutils.parser は、多くの日付文字列フォーマットをパースして datetime オブジェクトに変換します。

単に特定の文字列が が有効な日付を表すか含むかを知りたいだけなら、次のような簡単な関数を試してみてください。

from dateutil.parser import parse

def is_date(string, fuzzy=False):
    """
    Return whether the string can be interpreted as a date.

    :param string: str, string to check for date
    :param fuzzy: bool, ignore unknown tokens in string if True
    """
    try: 
        parse(string, fuzzy=fuzzy)
        return True

    except ValueError:
        return False

では、ありますね。

>>> is_date("1990-12-1")
True
>>> is_date("2005/3")
True
>>> is_date("Jan 19, 1990")
True
>>> is_date("today is 2019-03-27")
False
>>> is_date("today is 2019-03-27", fuzzy=True)
True
>>> is_date("Monday at 12:01am")
True
>>> is_date("xyz_not_a_date")
False
>>> is_date("yesterday")
False

カスタムパース

parse は、日付として扱いたくない文字列を日付として認識することがあります。例えば

  • パース "12""1999" は、現在の日付を表す datetime オブジェクトを返し、曜日と年は文字列の中の数字に置き換えられます。

  • "23, 4" そして "23 4" は、次のように解析されます。 datetime.datetime(2023, 4, 16, 0, 0) .

  • "Friday" は、未来の最も近い金曜日の日付を返します。
  • 同様に "August" は、月を8月に変更した現在の日付に対応します。

また parse はロケールを認識しないので、英語以外の言語では月や曜日を認識しません。

これらの問題は、カスタムの parserinfo クラスを使用することで、ある程度解決できます。

from dateutil.parser import parserinfo

class CustomParserInfo(parserinfo):

    # three months in Spanish for illustration
    MONTHS = [("Enero", "Enero"), ("Feb", "Febrero"), ("Marzo", "Marzo")]

このクラスのインスタンスを parse :

>>> parse("Enero 1990")
# ValueError: Unknown string format
>>> parse("Enero 1990", parserinfo=CustomParserInfo())
datetime.datetime(1990, 1, 27, 0, 0)