見出し画像

怪しいデータを見逃すな!2

大きな病院の外来は土日や祝日は閉まってますよね。
それにも関わらず、これらの日付の検査日があるのは怪しいです。

今日使うデータはこちらです。

vsdat(日付型)が祝日かどうか、あるいは土日かどうかを検出します。

日本の祝日

まずは日本の祝日を取得してみましょう。
日本の祝日はjpholidayライブラリで取ることができます。

import jpholiday

year = 2024

# 2024年の祝日を取得
holidays_2024 = jpholiday.year_holidays(year)

# 祝日を表示
for holiday in holidays_2024:
    date, name = holiday
    print(f"{date}: {name}")

結果は

日本は祝日が多いですね。もし複数の国のデータが混ざっている場合は国ごとに処理を変える必要があります。

土日を検出

それぞれの日付が何曜日かを調べるにはweekdayを使います。
月曜日を0として順番に番号が振られています。土曜日は5、日曜日は6です。なので、以下のようにして土日を検出できます。

def is_weekend(date):
    return date.weekday() >= 5  # 土曜日(5)と日曜日(6)はTrueを返す

土日は万国共通なので国にかかわらず使えます。

完成系

ではこれらを使って休みの日を検出するプログラムを作ってみます。
もし祝日だったらis_holidayがTrue、土日だったらis_weekendがTrueとなるような変数を元のdataframeに足します。

import pandas as pd
import jpholiday

vs = pd.read_csv("vs.csv", parse_dates=[2], index_col=["subjid", "visit"])


# 祝日かどうかをチェックして新しい列を追加する関数

def check_holiday(date):
    return jpholiday.is_holiday(date)

# 土日かどうかをチェックする関数
def is_weekend(date):
    return date.weekday() >= 5  # 土曜日(5)と日曜日(6)はTrueを返す

# 'VSDAT'列の各日付が祝日かどうかを示す新しい列を追加する
vs['is_holiday'] = vs['vsdat'].apply(check_holiday)

# 'VSDAT'列の各日付が土日かどうかを示す新しい列を追加する
vs['is_weekend'] = vs['vsdat'].apply(is_weekend)

結果は次のようになります。

is_holidayやis_weekendなどがTrueになっていたら、日付の間違いではないのか、もしくは本当に検査がされたのか、など確認したほうがよさそうです。

他の国の祝日は?

ほかの国の祝日は、holidaysライブラリで取得できます。アメリカの場合はこのようになります。

import holidays

# アメリカの祝日を指定
us_holidays = holidays.UnitedStates(years=2024)

# ある年のすべての祝日を表示
for date, name in sorted(us_holidays.items()):
    print(f"{date}: {name}")

結果は

日本より少ないですね。でも独立記念日、サンクスギビング、クリスマスの週あたりはほとんど休みになるので実質は変わらないのでしょう。
ちなみにポーランド(Poland)はこんな感じです。

この記事が気に入ったらサポートをしてみませんか?