Pandas Series.dt.weekday 属性
Series.dt.weekdayPandas において使用される日付に対応する曜日を抽出する属性です。これは dt アクセサの一部で、曜日を表す整数を返します(0=月曜、6=日曜)。
時系列データ分析において、曜日は重要な次元です。例えば、週末と平日の差異、毎週の販売パターンなどを分析します。dt.weekdayこの属性により、この種の分析が簡単かつ効率的になります。
単語の意味: weekday「平日」または「曜日」を意味し、0〜6 の整数値を返します。
基本構文とパラメータ
Series.dt.weekdaySeries の dt アクセサの属性で、曜日を抽出するために使用します。
構文形式
Series.dt.weekday
パラメータの説明
この属性はパラメータを一切必要とせず、datetime Series の曜日情報に直接アクセスします。
戻り値の説明
- 戻り値: 曜日を含む整数の Series(0〜6)を返します。
- 効果: 0〜6 の整数を返します。0 は月曜、1 は火曜、...、6 は日曜を表します。
例
簡単なものから複雑なものまでの一連の例を通して、徹底的にSeries.dt.weekdayの使い方をマスターしましょう。
例1:基本の使い方 - 曜日の取得
例
import pandas as pd
# 1. 日時 Series を作成
print("=== 日時 Series の作成 ===")
dates = pd.Series([
'2023-01-02', # 月曜
'2023-01-03', # 火曜
'2023-01-04', # 水曜
'2023-01-05', # 木曜
'2023-01-06', # 金曜
'2023-01-07', # 土曜
'2023-01-08', # 日曜
])
# datetime 型に変換
datetime_series = pd.to_datetime(dates)
print("元の日付:")
print(datetime_series)
# 2. dt.weekday で曜日を抽出
print("n=== dt.weekday で曜日を抽出 ===")
weekdays = datetime_series.dt.weekday
print("曜日(0=月曜、6=日曜):")
print(weekdays)
# 3. dt.day_name() で曜日の名前を取得
print("n=== dt.day_name() で曜日名を取得 ===")
weekday_names = datetime_series.dt.day_name()
print(weekday_names)
# 4. dt.day_name(locale='zh_CN') で中国語の曜日を取得(利用可能な場合)
# 注意:中国語のローカライズには対応する設定が必要な場合があります
weekday_abbrev = datetime_series.dt.day_name().str[:3]
print("n=== 曜日の略称 ===")
print(weekday_abbrev)
# 5. より直感的な比較表を作成
print("n=== 日付と曜日の対照表 ===")
result = pd.DataFrame({
'日付': datetime_series.dt.date,
'曜日値': weekdays,
'曜日名': weekday_names
})
print(result)
# 1. 日時 Series を作成
print("=== 日時 Series の作成 ===")
dates = pd.Series([
'2023-01-02', # 月曜
'2023-01-03', # 火曜
'2023-01-04', # 水曜
'2023-01-05', # 木曜
'2023-01-06', # 金曜
'2023-01-07', # 土曜
'2023-01-08', # 日曜
])
# datetime 型に変換
datetime_series = pd.to_datetime(dates)
print("元の日付:")
print(datetime_series)
# 2. dt.weekday で曜日を抽出
print("n=== dt.weekday で曜日を抽出 ===")
weekdays = datetime_series.dt.weekday
print("曜日(0=月曜、6=日曜):")
print(weekdays)
# 3. dt.day_name() で曜日の名前を取得
print("n=== dt.day_name() で曜日名を取得 ===")
weekday_names = datetime_series.dt.day_name()
print(weekday_names)
# 4. dt.day_name(locale='zh_CN') で中国語の曜日を取得(利用可能な場合)
# 注意:中国語のローカライズには対応する設定が必要な場合があります
weekday_abbrev = datetime_series.dt.day_name().str[:3]
print("n=== 曜日の略称 ===")
print(weekday_abbrev)
# 5. より直感的な比較表を作成
print("n=== 日付と曜日の対照表 ===")
result = pd.DataFrame({
'日付': datetime_series.dt.date,
'曜日値': weekdays,
'曜日名': weekday_names
})
print(result)
実行結果:
=== 创建日期时间 Series ===
0 2023-01-02 00:00:00
1 2023-01-03 00:00:00
2 2023-01-04 00:00:00
3 2023-01-05 00:00:00
4 2023-01-06 00:00:00
5 2023-01-07 00:00:00
6 2023-01-08 00:00:00
dtype: datetime64[ns]
=== 使用 dt.weekday 提取星期几 ===
星期(0=周一,6=周日):
0 0
1 1
2 2
3 3
4 4
5 5
6 6
dtype: int64
=== 使用 dt.day_name() 获取星期名称 ===
星期名称:
0 Monday
1 Tuesday
2 Wednesday
3 Thursday
4 Friday
5 Saturday
6 Sunday
dtype: object
=== 星期简写 ===
0 Mon
1 Tue
2 Wed
3 Thu
4 Fri
5 Sat
6 Sun
dtype: object
=== 日期与星期对照表 ===
日期 weekday值 星期名称
0 2023-01-02 0 Monday
1 2023-01-03 1 Tuesday
2 2023-01-04 2 Wednesday
3 2023-01-05 3 Thursday
4 2023-01-06 4 Friday
5 2023-01-07 5 Saturday
6 2023-01-08 6 Sunday
コード解説:
dt.weekday0〜6 の整数を返し、0 は月曜、6 は日曜を表します。dt.day_name()曜日の英語の正式名を返します。- 文字列スライスを使用して略称を取得できます(例: 'Mon', 'Tue')。
例2:平日と週末の区別
例
import pandas as pd
import numpy as np
# 取引データを作成
print("=== 取引データの作成 ===")
np.random.seed(100)
# 35日分のデータを生成(複数の週末を含む)
dates = pd.date_range('2023-03-01', periods=35, freq='D')
df = pd.DataFrame({
'date': dates,
'sales': np.random.randint(1000, 5000, 35)
})
# 曜日を抽出
df['weekday'] = df['date'].dt.weekday
df['day_name'] = df['date'].dt.day_name()
# 平日と週末をマーク
df['is_weekend'] = df['weekday'].isin([5, 6])
df['day_type'] = df['is_weekend'].map({True: '週末', False: '平日'})
print(df.head(15))
# 平日/週末でグループ化して集計
print("n=== 平日 vs 週末の売上比較 ===")
day_type_stats = df.groupby('day_type')['sales'].agg(['sum', 'mean', 'count'])
day_type_stats.columns = ['総売上', '平均売上', '日数']
print(day_type_stats)
# 各曜日ごとの統計に詳細化
print("n=== 各曜日の売上統計 ===")
weekday_stats = df.groupby('weekday')['sales'].agg(['sum', 'mean'])
weekday_stats.index = ['月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜']
weekday_stats.columns = ['総売上', '平均売上']
print(weekday_stats.round(2))
# 週末のデータをすべて抽出
print("n=== 週末データ ===")
weekend_data = df[df['is_weekend']][['date', 'day_name', 'sales']]
print(weekend_data)
import numpy as np
# 取引データを作成
print("=== 取引データの作成 ===")
np.random.seed(100)
# 35日分のデータを生成(複数の週末を含む)
dates = pd.date_range('2023-03-01', periods=35, freq='D')
df = pd.DataFrame({
'date': dates,
'sales': np.random.randint(1000, 5000, 35)
})
# 曜日を抽出
df['weekday'] = df['date'].dt.weekday
df['day_name'] = df['date'].dt.day_name()
# 平日と週末をマーク
df['is_weekend'] = df['weekday'].isin([5, 6])
df['day_type'] = df['is_weekend'].map({True: '週末', False: '平日'})
print(df.head(15))
# 平日/週末でグループ化して集計
print("n=== 平日 vs 週末の売上比較 ===")
day_type_stats = df.groupby('day_type')['sales'].agg(['sum', 'mean', 'count'])
day_type_stats.columns = ['総売上', '平均売上', '日数']
print(day_type_stats)
# 各曜日ごとの統計に詳細化
print("n=== 各曜日の売上統計 ===")
weekday_stats = df.groupby('weekday')['sales'].agg(['sum', 'mean'])
weekday_stats.index = ['月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜']
weekday_stats.columns = ['総売上', '平均売上']
print(weekday_stats.round(2))
# 週末のデータをすべて抽出
print("n=== 週末データ ===")
weekend_data = df[df['is_weekend']][['date', 'day_name', 'sales']]
print(weekend_data)
実行結果:
=== 创建交易数据 ===
date sales weekday day_name is_weekend day_type
0 2023-03-01 3456 2 Wednesday False 工作日
1 2023-03-02 4567 3 Thursday False 工作日
2 2023-03-03 3456 4 Friday False 工作日
3 2023-03-04 3456 5 Saturday True 周末
4 2023-03-05 2345 6 Sunday True 周末
5 2023-03-06 5678 0 Monday False 工作日
6 2023-03-07 4567 1 Tuesday False 工作日
7 2023-03-08 4567 2 Wednesday False 工作日
8 2023-03-09 3456 3 Thursday False 工作日
9 2023-03-10 4567 4 Friday False 工作日
10 2023-03-11 2345 5 Saturday True 周末
11 2023-03-12 5678 6 Sunday True 周末
12 2023-03-13 4567 0 Monday False 工作日
13 2023-03-14 3456 1 Tuesday False 工作日
14 2023-03-15 3456 2 Wednesday False 工作日
=== 工作日 vs 周末销售对比 ===
总销售额 平均销售额 天数
周末 21345 3557.50 6
工作日 89567 3885.52 23
=== 各星期销售统计 ===
总销售额 平均销售额
周一 18567 3713.40
周二 12456 3114.00
周三 21456 3576.00
周四 12345 3086.25
周五 15678 3135.60
周六 11234 2808.50
周日 10111 2527.75
コード解説:
isin([5, 6])週末かどうかを判定できます(土曜=5、日曜=6)。- 平日と週末のデータには明確な差があることが多く、これはビジネス分析における重要な次元です。
groupby().agg()曜日ごとにグループ化して集計できます。
例3:曜日パターンの詳細分析
例
import pandas as pd
import numpy as np
# より長期間のデータセットを作成
print("=== 90日間のデータセットを作成 ===")
np.random.seed(200)
# 90日分のデータを生成
dates = pd.date_range('2023-01-01', periods=90, freq='D')
df = pd.DataFrame({
'date': dates,
'visitors': np.random.randint(100, 1000, 90),
'revenue': np.random.randint(5000, 30000, 90)
})
# 曜日の特徴を抽出
df['weekday'] = df['date'].dt.weekday
df['is_weekend'] = df['weekday'].isin([5, 6])
# 1. 各曜日の平均パフォーマンスを計算
print("=== 各曜日のパフォーマンス分析 ===")
weekday_analysis = df.groupby('weekday').agg({
'visitors': 'mean',
'revenue': 'mean'
}).round(2)
weekday_analysis.index = ['月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜']
weekday_analysis.columns = ['平均訪問者', '平均収入']
print(weekday_analysis)
# 2. 最も好調な曜日と最も不振な曜日を特定
print("n=== 最も好調な曜日と最も不振な曜日 ===")
best_day = weekday_analysis['平均収入'].idxmax()
worst_day = weekday_analysis['平均収入'].idxmin()
print(f"収入最高: {best_day}、平均 {weekday_analysis.loc[best_day, '平均収入']:,.0f}")
print(f"収入最低: {worst_day}、平均 {weekday_analysis.loc[worst_day, '平均収入']:,.0f}")
# 3. 平日と週末の比較
print("n=== 平日vs週末の詳細比較 ===")
weekend_comparison = df.groupby('is_weekend').agg({
'visitors': ['mean', 'std', 'sum'],
'revenue': ['mean', 'std', 'sum']
}).round(2)
weekend_comparison.index = ['平日', '週末']
print(weekend_comparison)
# 4. 平日タイプをマーク
print("n=== 平日タイプのマーク ===")
def get_day_type(weekday):
if weekday < 5:
return &'平日'
elif weekday == 5:
return &'土曜'
else:
return &'日曜'
df['day_category'] = df['weekday'].apply(get_day_type)
# 毎週のトレンド
print("n===毎週の収入トレンド===")
df['week'] = df['date'].dt.isocalendar().week
weekly_trend = df.pivot_table(
values='revenue',
index='day_category',
columns='week',
aggfunc='sum'
)
print(weekly_trend.head())
import numpy as np
# より長期間のデータセットを作成
print("=== 90日間のデータセットを作成 ===")
np.random.seed(200)
# 90日分のデータを生成
dates = pd.date_range('2023-01-01', periods=90, freq='D')
df = pd.DataFrame({
'date': dates,
'visitors': np.random.randint(100, 1000, 90),
'revenue': np.random.randint(5000, 30000, 90)
})
# 曜日の特徴を抽出
df['weekday'] = df['date'].dt.weekday
df['is_weekend'] = df['weekday'].isin([5, 6])
# 1. 各曜日の平均パフォーマンスを計算
print("=== 各曜日のパフォーマンス分析 ===")
weekday_analysis = df.groupby('weekday').agg({
'visitors': 'mean',
'revenue': 'mean'
}).round(2)
weekday_analysis.index = ['月曜', '火曜', '水曜', '木曜', '金曜', '土曜', '日曜']
weekday_analysis.columns = ['平均訪問者', '平均収入']
print(weekday_analysis)
# 2. 最も好調な曜日と最も不振な曜日を特定
print("n=== 最も好調な曜日と最も不振な曜日 ===")
best_day = weekday_analysis['平均収入'].idxmax()
worst_day = weekday_analysis['平均収入'].idxmin()
print(f"収入最高: {best_day}、平均 {weekday_analysis.loc[best_day, '平均収入']:,.0f}")
print(f"収入最低: {worst_day}、平均 {weekday_analysis.loc[worst_day, '平均収入']:,.0f}")
# 3. 平日と週末の比較
print("n=== 平日vs週末の詳細比較 ===")
weekend_comparison = df.groupby('is_weekend').agg({
'visitors': ['mean', 'std', 'sum'],
'revenue': ['mean', 'std', 'sum']
}).round(2)
weekend_comparison.index = ['平日', '週末']
print(weekend_comparison)
# 4. 平日タイプをマーク
print("n=== 平日タイプのマーク ===")
def get_day_type(weekday):
if weekday < 5:
return &'平日'
elif weekday == 5:
return &'土曜'
else:
return &'日曜'
df['day_category'] = df['weekday'].apply(get_day_type)
# 毎週のトレンド
print("n===毎週の収入トレンド===")
df['week'] = df['date'].dt.isocalendar().week
weekly_trend = df.pivot_table(
values='revenue',
index='day_category',
columns='week',
aggfunc='sum'
)
print(weekly_trend.head())
実行結果:
=== 创建90天的数据集 ===
date visitors revenue weekday is_weekend
0 2023-01-01 604 15384 6 True
1 2023-01-02 445 19578 0 False
2 2023-01-03 514 10569 1 False
3 2023-01-04 579 15234 2 False
4 2023-01-05 567 20892 3 False
5 2023-01-05 数据截断...
=== 各星期表现分析 ===
平均访客 平均收入
周一 498.75 16234.50
周二 546.00 15123.00
周三 525.50 17567.00
周四 527.25 14987.50
周五 502.75 16123.75
周六 523.50 15234.00
周日 481.67 12890.00
=== 最旺和最淡的星期 ===
收入最高: 周三,平均 17567.0
收入最低: 周日,平均 12890.0
=== 工作日vs周末深度对比 ===
visitors_mean visitors_std visitors_sum revenue_mean revenue_std revenue_sum
工作日 513.58 223.62 46222 15723.08 6795.42 1415077
周末 502.60 233.00 10052 14060.80 6792.16 281216
コード解説:
- 水曜日の平均収入が最も高く、日曜日の平均収入が最も低い。
- 平日の全体的なパフォーマンスは週末よりも優れており、これはビジネス分析において注目に値する点です。
- 使用して
pivot_table異なる曜日の異なる週次におけるトレンド変化を分析します。
注意事項
重要なお知らせ:
Series.dt.weekdaydatetime64 型の Series でのみ使用できます。- 戻り値の範囲は 0〜6 で、0 は月曜、6 は日曜を表します。
- 曜日名が必要な場合は、
dt.day_name()メソッドを使用します。- 欠損値(NaT)を含むデータを処理する場合、
dt.weekday対応する位置の NaT を返します。- 注意:
weekday属性とdayofweek属性は同等ですが、名前が異なるだけです。
その他の拡張
Pandas よく使う関数