文字列が日付(任意のフォーマット)を持つかどうかをチェックする
質問
文字列が日付にパースされるかどうかを確認するにはどうすればよいですか?
- 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)
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] バイトを文字列に変換する
-
[解決済み] Bashで文字列が部分文字列を含むかどうかをチェックする方法
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】文字列をdatetimeに変換する
-
[解決済み] 前月の日時オブジェクトを返す
-
[解決済み] Flaskで1時間ごとに関数を実行するようにスケジュールするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] 文字列から先頭と末尾のスペースを削除するには?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] python-requests モジュールからのすべてのリクエストをログに記録します。
-
[解決済み] スペースがないテキストを単語のリストに分割する方法
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Celeryタスクのユニットテストはどのように行うのですか?
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?