Propriété Pandas Series.dt.day

Pandas 通用函数Fonctions courantes de Pandas


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

import pandas as pd

# 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 :

  1. dt.dayRenvoie des entiers de 1 à 31, représentant le jour du mois.
  2. Vous pouvez extraire l'année, le mois et le jour simultanément pour créer un nouveau DataFrame.
  3. 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.
  4. 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 pandas as pd
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

import pandas as pd

# 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 utilisererrors='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 utiliserdt.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.

Pandas 常用函数Fonctions courantes de Pandas

Autres extensions