Pythonでpandas Seriesから有効な日付だけをフィルタリングする方法
データ分析では、文字列として格納された日付の中から、正しい形式の日付だけを抽出したい場面がよくあります。この記事では、Pythonのpandasと正規表現(reモジュール)を使って、Series内から「YYYY-MM-DD」形式の有効な日付だけをフィルタリングする方法を2通り紹介します。
入力データと期待される出力
次のようなSeriesがあると仮定します。
0 2010-03-12 1 2011-3-1 2 2020-10-10 3 11-2-2
この中で「年4桁・月2桁・日2桁」という形式に合致する有効な日付は、以下の2つです。
0 2010-03-12 2 2020-10-10
使用する正規表現パターンの解説
今回使用するパターンは r"\d{4}\W\d{2}\W\d{2}" です。それぞれの意味は以下の通りです。
\d{4}:4桁の数字(年)\W:数字以外の1文字(区切り文字「-」など)\d{2}:2桁の数字(月)\d{2}:2桁の数字(日)
なお、「2011-3-1」のように月や日が1桁の場合や、「11-2-2」のように年が2桁の場合はパターンに一致しないため、自動的に除外されます。
解決策1:forループとre.match()を使う方法
Seriesの各要素に対して re.match() でパターン判定を行い、一致した要素だけを出力します。
import pandas as pd
import re
l = ['2010-03-12', '2011-3-1', '2020-10-10', '11-2-2']
data = pd.Series(l)
for i, j in data.items():
if re.match(r"\d{4}\W\d{2}\W\d{2}", j):
print(i, j)
出力結果
0 2010-03-12 2 2020-10-10 dtype: object
解決策2:filter()とlambda、isin()を使う方法
組み込み関数 filter() にlambda式を渡してパターンに一致する要素だけを取り出し、isin() を使って元のSeriesから該当行を抽出します。
import pandas as pd
import re
l = ['2010-03-12', '2011-3-1', '2020-10-10', '11-2-2']
data = pd.Series(l)
result = pd.Series(filter(lambda x: re.match(r"\d{4}\W\d{2}\W\d{2}", x), data))
print(data[data.isin(result)])
出力結果
0 2010-03-12 2 2020-10-10 dtype: object
補足:str.match()を使ったより簡潔な方法
pandasの文字列アクセサ .str.match() を使えば、さらに簡潔に記述できます。
mask = data.str.match(r"\d{4}\W\d{2}\W\d{2}")
print(data[mask])
この方法ではBooleanマスクで直接フィルタリングできるため、コードの可読性が高く、大規模データでも高速に動作するため実務におすすめです。
まとめ
正規表現によるパターンマッチングを組み合わせることで、不正な形式の日付が混在するSeriesからも、有効な日付だけを簡単に抽出できます。シンプルな処理ならforループと re.match()、ベクトル化された効率的な処理なら .str.match() や isin() の活用が効果的です。
-
PandasのSeriesから完全平方数を抽出・フィルタリングするPythonプログラム
データ分析では、数値の系列(Series)の中から特定の条件を満たす要素だけを取り出したい場面がよくあります。本記事では、PandasのSeriesから完全平方数(4、9、16、25のように、ある整数の2乗で表せる数)だけをフィルタリングする方法を、複数のアプローチでわかりやすく解説します。 入力例と出力例 次のようなSeriesを想定します。 0 14 1 16 2 30 3 49 4 80 dtype: int64 この中から完全平方数である要素だけを抽出すると、結果は次のようになります。 1 16 3 49 dtype: int64 解法1:
-
Pythonで数Nの桁数を数えるプログラムの書き方
ある数Nが与えられたとき、その数に含まれる桁の総数を求めることを考えましょう。例えば以下のようなケースです。入力例1:N = 891452出力:6解説: 与えられた数891452は6桁の数字で構成されているため、この場合は「6」を返します。入力例2:N = 0074515出力:5解説: 先頭の0を除いた有効な桁数が5桁であるため、出力は「5」となります。この問題を解くためのアプローチこの問題は、次の手順で解決できます。数値nを入力として受け取ります。関数countDigits(n)が入力nを受け取り、桁数をカウントして返します。数値の各桁に対してループ処理を行い、カウンター変数を1ずつ増加させ