Propriété Pandas Series.dt.day
Series.dt.dayest un attribut Pandas utilisé pourextraire le jour (la date) d'une date-heure. Il fait partie de l'accesseur dt et permet d'extraire rapidement le jour du mois (1-31) d'une Series datetime.
Dans l'analyse de données de séries temporelles, l'analyse par jour est une exigence courante, comme l'analyse de jours spécifiques de chaque mois, l'identification de motifs périodiques, etc.dt.dayCet attribut rend ces opérations simples et efficaces.
Définition du mot: dayIl signifie « jour », c'est-à-dire renvoie le jour dans une date (le jour du mois).
Syntaxe de base et paramètres
Series.dt.dayC'est un attribut de l'accesseur dt de Series, utilisé pour extraire le jour.
Format de syntaxe
Series.dt.day
Description du paramètre
Cet attribut ne nécessite aucun paramètre ; il accède directement aux informations de jour de la Series datetime.
Description de la valeur de retour
- Valeur de retourRenvoie une Series d'entiers contenant le jour (1-31).
- EffetExtrait la partie jour des dates d'une Series datetime64, en renvoyant des entiers de 1 à 31.
Exemple
Maîtrisons à fond, à travers une série d'exemples du plus simple au plus complexe,Series.dt.dayl'utilisation de cette propriété.
Exemple 1 : Utilisation de base - Extraire le jour
Exemple
# 1. Créer une Series datetime
print("=== Créer une Series datetime ===")
dates = pd.Series([
'2023-01-15',
'2023-02-20',
'2023-03-05',
'2023-04-30',
'2023-05-25',
'2023-12-31'
])
# Convertir en type datetime
datetime_series = pd.to_datetime(dates)
print("Date d'origine :")
print(datetime_series)
# 2. Utiliser dt.day pour extraire le jour
print("\n=== Utiliser dt.day pour extraire le jour ===")
days = datetime_series.dt.day
print("Jour :")
print(days)
# 3. Extraire l'année, le mois et le jour simultanément
print("\n=== Extraire simultanément l'année, le mois et le jour ===")
datetime_series = pd.to_datetime(dates)
df = pd.DataFrame({
'Date d’origine': datetime_series,
'Année': datetime_series.dt.year,
'Mois': datetime_series.dt.month,
'Jour': datetime_series.dt.day
})
print(df)
# 4. Voir combien de jours il y a dans chaque mois
print("\n=== Nombre de jours dans chaque mois ===")
dates_full = pd.date_range('2023-01-01', periods=12, freq='MS')
days_in_month = dates_full.dt.days_in_month
print(pd.DataFrame({
'Mois': dates_full,
'Nombre de jours': days_in_month
}))
# 5. Nombre de jours en février lors d'une année bissextile
print("\n=== Nombre de jours en février lors d'une année bissextile ===")
leap_feb = pd.Timestamp('2024-02-01').days_in_month
print(f"Jours en février 2024 : {leap_feb}")
non_leap_feb = pd.Timestamp('2023-02-01').days_in_month
print(f"Jours en février 2023 : {non_leap_feb}")
Sortie :
=== 创建日期时间 Series ===
0 2023-01-15
1 2023-02-20
2 2023-03-05
3 2023-04-30
4 2023-05-25
5 2023-12-31
dtype: datetime64[ns]
=== 使用 dt.day 提取天 ===
天:
0 15
1 20
2 5
3 30
4 25
5 31
dtype: int64
=== 同时提取年月日 ===
原始日期 年 月 日
0 2023-01-15 2023 1 15
1 2023-02-20 2023 2 20
2 2023-03-05 2023 3 5
3 2023-04-30 2023 4 30
4 2023-05-25 2023 5 25
5 2023-12-31 2023 12 31
=== 各月的天数 ===
月份 天数
0 2023-01-01 31
1 2023-02-01 28
2 2023-03-01 31
3 2023-04-01 30
4 2023-05-01 31
5 2023-06-01 30
6 2023-07-01 31
7 2023-08-01 31
8 2023-09-01 30
9 2023-10-01 31
10 2023-11-01 30
11 2023-12-01 31
=== 闰年2月天数 ===
2024年2月天数: 29
2023年2月天数: 28
Analyse du code :
dt.dayRenvoie des entiers de 1 à 31, représentant le jour du mois.- Vous pouvez extraire l'année, le mois et le jour simultanément pour créer un nouveau DataFrame.
days_in_monthCet attribut permet d'obtenir le nombre de jours de chaque mois, ce qui est très utile pour gérer les dates de fin de mois.- 2024 est une année bissextile, février a 29 jours ; 2023 est une année commune, février a 28 jours.
Exemple 2 : Filtrage et analyse par jour
Exemple
import numpy as np
# Créer un ensemble de données contenant des dates
print("=== Créer des données de transaction ===")
np.random.seed(100)
# Générer 30 jours de données
dates = pd.date_range('2023-03-01', periods=30, freq='D')
df = pd.DataFrame({
'date': dates,
'transactions': np.random.randint(50, 200, 30),
'revenue': np.random.randint(5000, 20000, 30)
})
# Extraire le jour
df['day'] = df['date'].dt.jour
print(df.head(15))
# Filtrer les enregistrements pour un jour spécifique (par ex., le 15 de chaque mois)
print("\n=== Transactions du 15 de chaque mois ===")
day_15 = df[df['day'] == 15]
print(day_15)
# Filtrer la première moitié et la seconde moitié du mois
print("\n=== Première moitié vs seconde moitié ===")
df['half'] = df['day'].apply(lambda x: 'Première moitié' if x <= 15 else 'Seconde moitié')
half_stats = df.groupby('half')['transactions'].agg(['sum', 'mean']).round(2)
half_stats.columns = ['Total des transactions', 'Moyenne des transactions']
print(half_stats)
# Statistiques par jour
print("\n=== Revenu moyen par jour ===")
daily_avg = df.groupby('day')['revenue'].mean().round(2)
print(daily_avg)
# Trouver le jour avec le revenu le plus élevé
print("\n=== Jours avec le chiffre d'affaires le plus élevé et le plus faible ===")
max_day = df.loc[df['revenue'].idxmax()]
min_day = df.loc[df['revenue'].idxmin()]
print(f"Chiffre d'affaires le plus élevé : {max_day['date'].date()}, montant {max_day['revenue']}")
print(f"Chiffre d'affaires le plus faible : {min_day['date'].date()}, montant {min_day['revenue']}")
Sortie :
=== 创建交易数据 ===
date transactions revenue day
0 2023-03-01 73 16200 1
1 2023-03-02 163 18800 2
2 2023-03-03 76 9600 3
3 2023-03-04 83 10500 4
4 2023-03-05 136 16200 5
5 2023-03-06 86 11700 6
6 2023-03-07 87 13400 7
7 2023-03-08 168 14200 8
8 2023-03-09 163 15800 9
9 2023-03-10 82 11000 10
10 2023-03-11 106 14600 11
11 2023-03-12 152 15900 12
12 2023-03-13 数据截断...
=== 每月15号的交易 ===
date transactions revenue day
14 2023-03-15 104 12900 15
=== 上半月 vs 下半月 ===
总交易数 平均交易数
下半月 2117 111.42
上半月 1873 117.06
=== 按天统计平均收入 ===
day
1 16200.00
2 18800.00
...
=== 收入最高和最低的天 ===
最高收入: 2023-03-02,金额 18800
最低收入: 2023-03-03,金额 9600
Analyse du code :
- Vous pouvez filtrer et effectuer une analyse groupée par jour.
- Vous pouvez diviser les jours en première et seconde moitié du mois pour l'analyse.
idxmax()etidxmin()Vous pouvez rapidement trouver les enregistrements correspondant aux valeurs maximale et minimale.
Exemple 3 : Gestion des dates de fin de mois
Exemple
# 1. Gérer le dernier jour des différents mois
print("=== Dernier jour de chaque mois ===")
dates = pd.date_range('2023-01-01', periods=12, freq='MS')
print("Premier jour de chaque mois :")
print(dates)
# Obtenir le dernier jour de chaque mois
last_days = dates + pd.offsets.MonthEnd(0)
print("\nDernier jour de chaque mois :")
print(last_days)
# 2. Déterminer si c'est la fin du mois
print("\n=== Déterminer si c'est la fin du mois ===")
test_dates = pd.Series([
'2023-01-30', # 30 janvier (pas la fin du mois)
'2023-01-31', # 31 janvier (fin du mois)
'2023-02-28', # 28 février (année non bissextile)
'2023-04-30', # 30 avril (fin du mois)
])
dt_series = pd.to_datetime(test_dates)
is_month_end = dt_series.is_month_end
result = pd.DataFrame({
'Date': dt_series,
'Est la fin du mois': is_month_end
})
print(result)
# 3. Gestion des dates de début de mois
print("\n=== Déterminer s'il s'agit du début du mois ===")
is_month_start = dt_series.is_month_start
result['Est le début du mois'] = is_month_start
print(result)
# 4. Gestion des mois ayant un nombre de jours différent
print("\n=== Gestion des mois ayant un nombre de jours différent ===")
dates_to_check = pd.Series([
'2023-01-31', # Date valide
'2023-02-30', # Date invalide (février n'a pas de 30)
])
# Essayez de convertir et de gérer les dates invalides
try:
valid_dates = pd.to_datetime(dates_to_check, errors='coerce')
print("Date convertie :")
print(valid_dates)
print("\nJour correspondant à chaque date :")
print(valid_dates.dt.day)
except Exception as e:
print(f"Erreur: {e}")
Sortie :
=== 各月最后一天 ===
每月第一天:
DatetimeIndex(['2023-01-01', '2023-02-01', '2023-03-01', '2023-04-01',
'2023-05-01', '2023-06-01', '2023-07-01', '2023-03-01',
'2023-09-01', '2023-10-01', '2023-11-01', '2023-12-01'],
dtype='datetime64[ns]', freq=None)
每月最后一天:
DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30',
'2023-05-31', '2023-06-30', '2023-07-31', '2023-03-31',
'2023-09-30', '2023-10-31', '2023-11-30', '2023-12-31'],
dtype='datetime64[ns]', freq=None)
=== 判断是否为月末 ===
日期 是否为月末
0 2023-01-30 False
1 2023-01-31 True
2 2023-02-28 True
3 2023-04-30 True
=== 判断是否为月初 ===
日期 是否为月末 是否为月初
0 2023-01-30 False False
1 2023-01-31 False False
2 2023-02-28 False False
3 2023-04-30 False False
=== 月份天数不一致的处理 ===
转换后的日期:
0 2023-01-31
1 NaT
Name: date, dtype: datetime64[ns]
各日期对应的天:
0 31.0
1 NaN
Analyse du code :
is_month_endCet attribut peut déterminer s'il s'agit de la fin du mois.is_month_startCet attribut peut déterminer s'il s'agit du début du mois.pd.offsets.MonthEnd(0)Vous pouvez obtenir le dernier jour du mois.- Lors de la gestion des dates invalides, vous pouvez utiliser
errors='coerce'pour convertir les dates invalides en NaT.
Notes
Remarques importantes :
Series.dt.dayIl ne peut être utilisé que sur des Series de type datetime64.- La plage de jours renvoyée est 1-31 ; le maximum exact dépend du mois (février a un maximum de 28/29 jours, avril/juin/septembre/novembre ont 30 jours, et les autres mois ont 31 jours).
- Vous pouvez utiliser
dt.days_in_monthpour obtenir le nombre de jours de chaque mois.- Lors du traitement de données contenant des valeurs manquantes (NaT),
dt.dayNaT sera renvoyé à la position correspondante.
Autres extensions
Fonctions courantes de Pandas