Pandas Series.dt.day-Eigenschaft
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
# 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:
dt.dayGibt ganze Zahlen von 1 bis 31 zurück, die den Tag des Monats darstellen.- Sie können Jahr, Monat und Tag gleichzeitig extrahieren, um einen neuen DataFrame zu erstellen.
days_in_monthDieses Attribut kann die Anzahl der Tage in jedem Monat ermitteln, was sehr nützlich für die Behandlung von Monatsenddaten ist.- 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 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
# 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 Sie
errors='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önnen
dt.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.
Andere Erweiterungen
Pandas Häufige Funktionen