Pandas: التاريخ والوقت
آخر تحديث: 2026-08-26
الخطوة الأولى في تحليل السلاسل الزمنية هي تحويل التواريخ المكتوبة كنصوص إلى أنواع التاريخ والوقت في Pandas. يتيح DatetimeIndex التجميع حسب الأسبوع أو الشهر أو الربع، كما يتيح وصول dt تفكيك التواريخ تمامًا كفصل النصوص، وتجعل Timedelta العمليات الحسابية على التواريخ مباشرة. يغطي هذا القسم نظام أنواع التاريخ والوقت، والتحليل، والاستخراج، والعمليات الحسابية.
1. What You Will Learn
- ❶ Timestamp / DatetimeIndex
- ❷ pd.to_datetime parsing
- ❸ .dt accessor
- ❹ Timedelta arithmetic
- ❺ date_range and frequency
2. محطة الطقس تشارلي وموقف العطاء في معالجة الوقت
(1) نقطة الألم: التواريخ سلاسل نصية، مما يجعل التجميع الشهري مستحيلًا
بيانات محطة طقس تشارلي تخزن التواريخ كنصوص (سلاسل نصية)، مما يجعل إحصائيات الشهر مستحيلة:
import pandas as pd
df = pd.DataFrame({
'date_str': ['2024-01-15', '2024-01-20', '2024-02-10', '2024-02-28', '2024-03-15'],
'temperature': [5.2, 3.8, 8.1, 9.5, 12.3]
})
# df.groupby(df['date_str'].str[:7]) — حل غير آمن!
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
(2) الحل: to_datetime + dt
▶ مثال
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
: تحليل واستخراج to_datetime (الصعوبة ⭐)
import pandas as pd
df = pd.DataFrame({
'date_str': ['2024-01-15', '2024-01-20', '2024-02-10', '2024-02-28', '2024-03-15'],
'temperature': [5.2, 3.8, 8.1, 9.5, 12.3]
})
# تحويل النص إلى كائن تاريخ
df['date'] = pd.to_datetime(df['date_str'])
# استخراج الشهر للتجميع
df['month'] = df['date'].dt.month
# التجميع حسب الشهر
monthly = df.groupby('month')['temperature'].mean()
print(monthly)
# month
# 1 4.50
# 2 8.80
# 3 12.30
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
3. نظام أنواع التاريخ والوقت في Pandas
(1) أربعة أنواع للتاريخ والوقت
| النوع | الغرض | مثال |
|---|---|---|
| Timestamp | نقطة زمنية واحدة | pd.Timestamp('2024-01-15') |
| DatetimeIndex | سلسلة من الطوابع الزمنية | pd.date_range('2024-01', periods=3, freq='M') |
| Timedelta | المدة بين نقطتين زمنيتين | pd.Timedelta(days=7) |
| Period | فترة زمنية محددة | pd.Period('2024-01', freq='M') |
▶ مثال
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) ومتابعة الشرح. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
: إنشاء أنواع التاريخ والوقت (الصعوبة ⭐)
import pandas as pd
# Timestamp — نقطة زمنية واحدة
ts = pd.Timestamp('2024-01-15 10:30:00')
print(ts.year, ts.month, ts.day, ts.hour)
# 2024 1 15 10
# DatetimeIndex — سلسلة من الطوابع الزمنية
idx = pd.date_range('2024-01-01', periods=5, freq='D')
print(idx)
# DatetimeIndex(['2024-01-01', '2024-01-02', ...], dtype='datetime64[ns]')
# Timedelta — المدة الزمنية
delta = pd.Timedelta(days=7, hours=3)
print(delta) # 7 days 03:00:00
print(ts + delta) # 2024-01-22 13:30:00
# Period — فترة زمنية (شهر/ربع سنة/سنة)
p = pd.Period('2024-Q1', freq='Q')
print(p.start_time, p.end_time)
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) ومتابعة الشرح. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
4. pd.to_datetime
(1) تحليل عدة صيغ
▶ مثال
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
: تحليل الصيغ المتعددة للوقت والتاريخ (الصعوبة ⭐⭐)
import pandas as pd
# صيغة ISO (يتم كشفها تلقائياً)
dates1 = pd.to_datetime(['2024-01-15', '2024-02-20', '2024-03-10'])
print(dates1)
# صيغ مختلطة
dates2 = pd.to_datetime(['01/15/2024', 'Feb 20, 2024', '20240310'])
print(dates2)
# تحديد الصيغة صراحة (أسرع للبيانات الكبيرة)
dates3 = pd.to_datetime(['15-01-2024', '20-02-2024'], format='%d-%m-%Y')
print(dates3)
# معالجة الأخطاء
bad_dates = pd.to_datetime(
['2024-01-15', 'not-a-date', '2024-03-10'],
errors='coerce' # غير صالحة → NaT (وليس errors='raise')
)
print(bad_dates)
# DatetimeIndex(['2024-01-15', 'NaT', '2024-03-10'])
# طابع Unix الزمني
unix_ts = pd.to_datetime([1705276800, 1707974400], unit='s')
print(unix_ts)
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
(2) أكواد الصيغ الشائعة
| الكود | المعنى | المثال |
|---|---|---|
| %Y | سنة مكونة من 4 خانات | 2024 |
| %m | شهر مكون من خانتين | 01 |
| %d | يوم مكون من خانتين | 15 |
| %H | ساعة بنظام 24 ساعة | 14 |
| %M | دقيقة | 30 |
| %S | ثانية | 00 |
| %b | اسم الشهر مختصراً | Jan |
| %B | اسم الشهر كاملاً | January |
| %a | اسم يوم الأسبوع مختصراً | Mon |
5. accessor .dt
(1) استخراج خصائص التاريخ والوقت
▶ مثال
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
: خصائص accessor dt (الصعوبة ⭐⭐)
import pandas as pd
df = pd.DataFrame({
'timestamp': pd.date_range('2024-01-15 08:30:00', periods=5, freq='12h')
})
# Extract date components
df['year'] = df['timestamp'].dt.year
df['month'] = df['timestamp'].dt.month
df['day'] = df['timestamp'].dt.day
df['hour'] = df['timestamp'].dt.hour
df['day_of_week'] = df['timestamp'].dt.dayofweek # 0=Mon, 6=Sun
df['day_name'] = df['timestamp'].dt.day_name() # Monday, Tuesday...
df['is_weekend'] = df['timestamp'].dt.dayofweek >= 5
df['quarter'] = df['timestamp'].dt.quarter
print(df[['timestamp', 'month', 'day_name', 'is_weekend', 'quarter']])
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
(2) طرق dt
▶ مثال
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
: عمليات طريقة dt (الصعوبة ⭐)
import pandas as pd
dates = pd.Series(pd.date_range('2024-01-15', periods=5, freq='2D'))
# Convert to period
print(dates.dt.to_period('M')) # monthly periods
# Normalize to midnight (remove time component)
print(dates.dt.normalize())
# Round to nearest hour
timestamps = pd.Series(pd.date_range('2024-01-15 08:35:00', periods=3, freq='45min'))
print(timestamps.dt.round('h')) # round to nearest hour
# Floor / Ceil
print(timestamps.dt.floor('h')) # round down
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
6. حسابات فارق الوقت (Timedelta)
(1) جمع وطرح التواريخ
▶ مثال
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) واتباع الخطوات. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
: حسابات فارق الوقت (الصعوبة ⭐⭐)
import pandas as pd
# إنشاء ختم زمني
start = pd.Timestamp('2024-01-15')
deadline = start + pd.Timedelta(days=30)
print(f"الموعد النهائي: {delivery}")
# الفرق بين التواريخ
delivery = pd.Timestamp('2024-02-10')
delay = delivery - deadline
print(f"التأخير: {delay.days} يوم") # -4 أيام (مبكر)
# فارق الوقت من سلسلة نصية
td = pd.to_timedelta('5 days 3 hours')
print(td)
# عمليات على سلاسل pandas
df = pd.DataFrame({
'order_date': pd.date_range('2024-01-01', periods=5),
'delivery_days': [3, 5, 2, 7, 4]
})
df['delivery_date'] = df['order_date'] + pd.to_timedelta(df['delivery_days'], unit='D')
df['is_late'] = df['delivery_days'] > 5
print(df)
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) واتباع الخطوات. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.
7. نطاق التاريخ والتردد
(1) توليد تسلسلات التواريخ
▶ مثال
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
: نطاق التاريخ لتوليد التاريخ (الصعوبة ⭐⭐)
import pandas as pd
# Fixed number of periods
print(pd.date_range('2024-01-01', periods=5, freq='D'))
# 2024-01-01 to 2024-01-05
# Start + End
print(pd.date_range('2024-01-01', '2024-01-10', freq='2D'))
# 2024-01-01, 2024-01-03, 2024-01-05, 2024-01-07, 2024-01-09
# Business days only
bdays = pd.bdate_range('2024-01-01', periods=5) # skip weekends
print(bdays)
# Monthly frequency
months = pd.date_range('2024-01', periods=4, freq='MS') # Month Start
print(months)
# Hourly
hours = pd.date_range('2024-01-15 09:00', periods=4, freq='h')
print(hours)
> **Output:** Run in a local Python environment (pandas 2.x). The Piston server does not have pandas pre-installed. Please install it locally (`pip install pandas`) and follow along. Actual values may vary slightly depending on the pandas version.
(2) مرجع سريع للأسماء المستعارة للتردد
| الرمز | المعنى | مثال |
|---|---|---|
| D | يوم تقويمي | كل يوم |
| B | يوم عمل | تخطي عطلات نهاية الأسبوع |
| W | أسبوعي | كل يوم أحد |
| MS | بداية الشهر | أول كل شهر |
| M | نهاية الشهر | آخر يوم في كل شهر |
| QS | بداية الربع | أول يوم في كل ربع سنوي |
| Q | نهاية الربع | آخر يوم في كل ربع سنوي |
| H | كل ساعة | كل ساعة |
| T/min | كل دقيقة | كل دقيقة |
8. مثال كامل: تحليل السلاسل الزمنية لمقهى القهوة
(5) ▶ نظام أنواع التاريخ والوقت
graph LR
A[Pandas Datetime Types] --> B[Timestamp Point in Time]
A --> C[DatetimeIndex Time Series]
A --> D[Timedelta Duration]
A --> E[Period Time Span]
B --> F[Single moment]
C --> G[Aggregate by frequency]
D --> H[Date arithmetic]
E --> I[Monthly/quarterly aggregation]
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.
▶ مثال
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.
: سير عمل تحليل السلاسل الزمنية الكامل (الصعوبة ⭐⭐⭐)
import pandas as pd
import numpy as np
# ============================================
# مثال شامل: تحليل سلاسل زمنية لمقهى
# القهوة باستخدام عمليات التاريخ والوقت
# ============================================
# 1. إنشاء بيانات مبيعات يومية لـ 90 يوماً
np.random.seed(42)
df = pd.DataFrame({
'date': pd.date_range('2024-01-01', periods=90, freq='D'),
'sales': np.random.poisson(50, 90) * 10,
'customers': np.random.poisson(30, 90)
})
df = df.set_index('date')
# 2. استخراج سمات الوقت
df['month'] = df.index.month
df['day_of_week'] = df.index.dayofweek
df['day_name'] = df.index.day_name()
df['is_weekend'] = df.index.dayofweek >= 5
df['week_number'] = df.index.isocalendar().week.astype(int)
# 3. ملخص شهري
monthly = df.groupby('month').agg(
total_sales=('sales', 'sum'),
avg_customers=('customers', 'mean'),
days=('sales', 'count')
).round(0)
print("=== الملخص الشهري ===")
print(monthly)
# 4. أيام الأسبوع مقابل عطلة نهاية الأسبوع
wknd = df.groupby('is_weekend')['sales'].mean().round(0)
print(f"\n=== أيام الأسبوع مقابل عطلة نهاية الأسبوع ===\n{wknd}")
# 5. أفضل يوم في الأسبوع
best_day = df.groupby('day_name')['sales'].mean().sort_values(ascending=False)
print(f"\n=== أفضل يوم ===\n{best_day.head(3)}")
# 6. النمو من شهر إلى آخر
monthly_sales = df.resample('M')['sales'].sum()
mom_growth = monthly_sales.pct_change().round(3) * 100
print(f"\n=== نسبة النمو من شهر لآخر % ===\n{mom_growth}")
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.
❓ أسئلة شائعة
pd.to_datetime(s, format='%d/%m/%Y'). أكواد تنسيق strftime في بايثون: %Y للسنة، %m للشهر، %d لليوم، %H للساعة، %M للدقيقة، %S للثانية. تحديد الصيغة أسرع بـ 5-10 مرات من الكشف التلقائي.date_range(freq='D') يولّد كل يوم، بينما bdate_range() أو freq='B' يولّد أيام العمل فقط. للتكرار الشهري، MS = بداية الشهر، M = نهاية الشهر. اختيار التكرار الخاطئ يمكن أن يؤدي إلى نتائج إعادة تعيين مختلفة تمامًا.df.index.tz_localize('UTC').tz_convert('Asia/Shanghai'). يستخدم Pandas مكتبات المناطق الزمنية pytz/dateutil. سير عمل شائع: قراءة الطوابع الزمنية بالتوقيت العالمي → التحويل إلى المنطقة الزمنية المحلية → التجميع حسب التاريخ المحلي.📖 ملخص
- يحتوي Pandas على أربعة أنواع من التواريخ: Timestamp (نقطة في الزمن) / DatetimeIndex (سلسلة زمنية) / Timedelta (مدة زمنية) / Period (فترة زمنية)
- يحوّل pd.to_datetime النصوص إلى تواريخ؛ يُحدد معلمة format الصيغة؛ يتعامل errors='coerce' مع القيم غير الصالحة بسلاسة
- يستخرج accessor الـ .dt خصائص التاريخ (السنة/الشهر/اليوم/الساعة/يوم الأسبوع/الربع، إلخ)
- يدعم Timedelta إضافة وطرح التواريخ؛ يُنشئ pd.to_timedelta مددًا زمنية من النصوص أو الأرقام
- تُولّد date_range تسلسلات تواريخ باستخدام اختصارات التردد D/B/W/MS/M/QS/Q/H
- يُتيح استخدام DatetimeIndex كفهرس تحليل السلاسل الزمنية (resample/shift/rolling)
- استخدم bdate_range أو freq='B' لأيام العمل؛ استخدم tz_localize/tz_convert للمناطق الزمنية
📝 تمارين
- تمرين أساسي (مستوى الصعوبة ⭐): إنشاء سلسلة (Series) تحتوي على نصوص تاريخ، تحليلها باستخدام
to_datetime، استخراج الشهر ويوم الأسبوع، وعد سجلات كل شهر. - تمرين متوسط (مستوى الصعوبة ⭐⭐): إنشاء إطار بيانات (DataFrame) لبيانات المبيعات اليومية لمدة 30 يومًا (مع مؤشر زمني
DatetimeIndex)، استخدامdtلاستخراجis_weekend، مقارنة متوسط المبيعات بين أيام الأسبوع وعطلات نهاية الأسبوع، وحسابTimedeltaلمعرفة المدة المنقضية منذ يوم أعلى مبيعات. - تمرين تحدي (مستوى الصعوبة ⭐⭐⭐): محاكاة بيانات مبيعات مقهى لمدة 90 يومًا وإكمال ما يلي: تحليل باستخدام
to_datetime→set_index→ استخراج الشهر/الربع/يوم الأسبوع باستخدامdt→ ملخص شهري باستخدامgroupby→ حساب نسبة النمو من شهر لآخر → إيجاد أفضل يوم من أيام الأسبوع أداءً.
← Previous: String Operations · Next: Advanced Time Series →