Pandas Series.dt.day-Eigenschaft

Pandas 通用函数Pandas Häufige Funktionen


Series.dt.dayist ein Pandas-Attribut, das verwendet wird, umden Tag (das Datum) aus date-timezu extrahieren. Es ist Teil des dt-Accessors und kann schnell den Tag des Monats (1-31) aus einer datetime Series extrahieren.

In der Zeitreihenanalyse ist die Analyse nach Tagen eine häufige Anforderung, wie z. B. die Analyse bestimmter Tage jedes Monats, die Identifizierung periodischer Muster usw.dt.dayDieses Attribut macht solche Operationen einfach und effizient.

Wortdefinition: dayEs bedeutet "Tag", d. h., es gibt den Tag in einem Datum zurück (den Tag des Monats).


Grundlegende Syntax und Parameter

Series.dt.dayEs ist ein Attribut des Series-dt-Accessors und wird verwendet, um den Tag zu extrahieren.

Syntaxformat

Series.dt.day

Parameterbeschreibung

Dieses Attribut erfordert keine Parameter; es greift direkt auf die Tagesinformationen der datetime Series zu.

Beschreibung des Rückgabewerts

  • RückgabewertGibt eine Integer-Series zurück, die den Tag (1-31) enthält.
  • WirkungExtrahiert den Tagesteil von Datumsangaben aus einer datetime64-Series und gibt ganze Zahlen von 1 bis 31 zurück.

Beispiel

Lassen Sie uns durch eine Reihe von Beispielen von einfach bis komplex gründlich meistern,Series.dt.daydie Verwendung dieser Eigenschaft.

Beispiel 1: Grundlegende Verwendung - Tag extrahieren

Beispiel

import pandas as pd

# 1. Erstellen einer datetime Series
print("=== datetime Series erstellen ===")
dates = pd.Series([
    '2023-01-15',
    '2023-02-20',
    '2023-03-05',
    '2023-04-30',
    '2023-05-25',
    '2023-12-31'
])

# In datetime-Typ umwandeln
datetime_ = pd.to_datetime(dates)
print("Originaldatum:")
print(datetime_series)

# 2. dt.day verwenden, um den Tag zu extrahieren
print("\n=== dt.day verwenden, um den Tag zu extrahieren ===")
days = datetime_series.dt.day
print("Tag:")
print(days)

# 3. Jahr, Monat und Tag gleichzeitig extrahieren
print("\n=== Jahr, Monat und Tag gleichzeitig extrahieren ===")
datetime_ = pd.to_datetime(dates)
df = pd.DataFrame({
    'Ursprüngliches Datum': datetime_series,
    'Jahr': datetime_series.dt.year,
    'Monat': datetime_series.dt.month,
    'Tag': datetime_series.dt.day
})
print(df)

# 4. Anzeigen, wie viele Tage jeder Monat hat
print("\n=== Anzahl der Tage in jedem Monat ===")
dates_full = pd.date_range('2023-01-01', periods=12, freq='MS')
days_in_month = dates_full.dt.days_in_month
print(pd.DataFrame({
    'Monat': dates_full,
    'Anzahl der Tage': days_in_month
}))

# 5. Anzahl der Tage im Februar in einem Schaltjahr
print("\n=== Anzahl der Tage im Februar in einem Schaltjahr ===")
leap_feb = pd.Timestamp('2024-02-01').days_in_month
print(f"Tage im Februar 2024: {leap_feb}")
non_leap_feb = pd.Timestamp('2023-02-01').days_in_month
print(f"Tage im Februar 2023: {non_leap_feb}")

Ausgabe:

=== 创建日期时间 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

Codeanalyse:

  1. dt.dayGibt ganze Zahlen von 1 bis 31 zurück, die den Tag des Monats darstellen.
  2. Sie können Jahr, Monat und Tag gleichzeitig extrahieren, um einen neuen DataFrame zu erstellen.
  3. days_in_monthDieses Attribut kann die Anzahl der Tage in jedem Monat ermitteln, was sehr nützlich für die Behandlung von Monatsenddaten ist.
  4. 2024 ist ein Schaltjahr, der Februar hat 29 Tage; 2023 ist ein Gemeinjahr, der Februar hat 28 Tage.

Beispiel 2: Filterung und Analyse nach Tag

Beispiel

import pandas as pd
import numpy as np

# Erstellen eines Datensatzes mit Datumsangaben
print("=== Transaktionsdaten erstellen ===")
np.random.seed(100)

# Daten für 30 Tage generieren
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)
})

# Den Tag extrahieren
df['day'] = df['date'].dt.day
print(df.head(15))

# Datensätze für einen bestimmten Tag filtern (z. B. den 15. jedes Monats)
print("\n=== Transaktionen am 15. jedes Monats ===")
day_15 = df[df['day'] == 15]
print(day_15)

# Erste und zweite Monatshälfte filtern
print("\n=== Erste Hälfte vs. zweite Hälfte ===")
df['half'] = df['day'].apply(lambda x: 'Erste Hälfte' if x <= 15 else 'Zweite Hälfte')
half_stats = df.groupby('half')['transactions'].agg(['sum', 'mean']).round(2)
half_stats.columns = ['Gesamttransaktionen', 'Durchschnittliche Transaktionen']
print(half_stats)

# Statistiken nach Tag
print("\n=== Durchschnittlicher Umsatz nach Tag ===")
daily_avg = df.groupby('day')['revenue'].mean().round(2)
print(daily_avg)

# Tag mit dem höchsten Umsatz finden
print("\n=== Tage mit höchstem und niedrigstem Umsatz ===")
max_day = df.loc[df['revenue'].idxmax()]
min_day = df.loc[df['revenue'].idxmin()]
print(f"Höchster Umsatz: {max_day['date'].date()}, Betrag {max_day['revenue']}")
print(f"Niedrigster Umsatz: {min_day['date'].date()}, Betrag {min_day['revenue']}")

Ausgabe:

=== 创建交易数据 ===
         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

Codeanalyse:

  • Sie können nach Tag filtern und eine Gruppenanalyse durchführen.
  • Sie können Tage für die Analyse in die erste und zweite Monatshälfte aufteilen.
  • idxmax()undidxmin()Sie können schnell die Datensätze finden, die den maximalen und minimalen Werten entsprechen.

Beispiel 3: Umgang mit Monatsenddaten

Beispiel

import pandas as pd

# 1. Letzten Tag verschiedener Monate behandeln
print("=== Letzter Tag jedes Monats ===")
dates = pd.date_range('2023-01-01', periods=12, freq='MS')
print("Erster Tag jedes Monats:")
print(dates)

# Ermittle den letzten Tag jedes Monats
last_days = dates + pd.offsets.MonthEnd(0)
print("\nLetzter Tag jedes Monats:")
print(last_days)

# 2. Ermittle, ob es das Monatsende ist
print("\n=== Ermittle, ob es das Monatsende ist ===")
test_dates = pd.Series([
    '2023-01-30',  # 30. Januar (nicht das Monatsende)
    '2023-01-31',  # 31. Januar (Monatsende)
    '2023-02-28',  # 28. Februar (kein Schaltjahr)
    '2023-04-30',  # 30. April (Monatsende)
])

dt_series = pd.to_datetime(test_dates)
is_month_end = dt_series.is_month_end

result = pd.DataFrame({
    'Datum': dt_series,
    'Ist Monatsende': is_month_end
})
print(result)

# 3. Umgang mit Monatsanfangsdaten
print("\n=== Ermitteln, ob es der Monatsanfang ist ===")
is_month_start = dt_series.is_month_start
result['Ist Monatsanfang'] = is_month_start
print(result)

# 4. Umgang mit Monaten mit unterschiedlich vielen Tagen
print("\n=== Umgang mit Monaten mit unterschiedlich vielen Tagen ===")
dates_to_check = pd.Series([
    '2023-01-31',  # Gültiges Datum
    '2023-02-30',  # Ungültiges Datum (Februar hat keinen 30.)
])

# Versuchen Sie, ungültige Datumsangaben zu konvertieren und zu behandeln
try:
    valid_dates = pd.to_datetime(dates_to_check, errors='coerce')
    print("Konvertiertes Datum:")
    print(valid_dates)
    print("\nTag, der jedem Datum entspricht:")
    print(valid_dates.dt.day)
except Exception as e:
    print(f"Fehler: {e}")

Ausgabe:

=== 各月最后一天 ===
每月第一天:
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

Codeanalyse:

  • is_month_endMit diesem Attribut lässt sich feststellen, ob es sich um das Monatsende handelt.
  • is_month_startMit diesem Attribut lässt sich feststellen, ob es sich um den Monatsanfang handelt.
  • pd.offsets.MonthEnd(0)Sie können den letzten Tag des Monats abrufen.
  • Bei der Behandlung ungültiger Datumsangaben können Sieerrors='coerce'um ungültige Datumsangaben in NaT umzuwandeln.

Hinweise

Wichtige Hinweise:

  • Series.dt.dayEs kann nur auf Series vom Typ datetime64 verwendet werden.
  • Der zurückgegebene Tagesbereich ist 1-31; der genaue Maximalwert hängt vom Monat ab (Februar hat maximal 28/29 Tage, April/Juni/September/November haben 30 Tage und andere Monate haben 31 Tage).
  • Sie könnendt.days_in_monthum die Anzahl der Tage in jedem Monat zu erhalten.
  • Beim Umgang mit Daten, die fehlende Werte (NaT) enthalten,dt.daywird NaT an der entsprechenden Position zurückgegeben.

Pandas 常用函数Pandas Häufige Funktionen

Andere Erweiterungen