Pandas: التاريخ والوقت

آخر تحديث: 2026-08-26

الخطوة الأولى في تحليل السلاسل الزمنية هي تحويل التواريخ المكتوبة كنصوص إلى أنواع التاريخ والوقت في Pandas. يتيح DatetimeIndex التجميع حسب الأسبوع أو الشهر أو الربع، كما يتيح وصول dt تفكيك التواريخ تمامًا كفصل النصوص، وتجعل Timedelta العمليات الحسابية على التواريخ مباشرة. يغطي هذا القسم نظام أنواع التاريخ والوقت، والتحليل، والاستخراج، والعمليات الحسابية.

⚠️ ملاحظة: يتطلب الكود أدناه بيئة Python محلية للتشغيل.

1. What You Will Learn


2. محطة الطقس تشارلي وموقف العطاء في معالجة الوقت

(1) نقطة الألم: التواريخ سلاسل نصية، مما يجعل التجميع الشهري مستحيلًا

بيانات محطة طقس تشارلي تخزن التواريخ كنصوص (سلاسل نصية)، مما يجعل إحصائيات الشهر مستحيلة:

PYTHON
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]) — حل غير آمن!
TEXT 📖 للعرض فقط
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

(2) الحل: to_datetime + dt

▶ مثال

TEXT 📖 للعرض فقط
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

: تحليل واستخراج to_datetime (الصعوبة ⭐)

PYTHON
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
TEXT 📖 للعرض فقط
> **الناتج:** قم بالتشغيل في بيئة بايثون محلية (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')

▶ مثال

TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) ومتابعة الشرح. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

: إنشاء أنواع التاريخ والوقت (الصعوبة ⭐)

PYTHON
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)
TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على مكتبة pandas مثبتة مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) ومتابعة الشرح. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

4. pd.to_datetime

(1) تحليل عدة صيغ

▶ مثال

TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) والمتابعة. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

: تحليل الصيغ المتعددة للوقت والتاريخ (الصعوبة ⭐⭐)

PYTHON
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)
TEXT 📖 للعرض فقط
> **المخرجات:** قم بالتشغيل في بيئة بايثون محلية (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) استخراج خصائص التاريخ والوقت

▶ مثال

TEXT 📖 للعرض فقط
> **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 (الصعوبة ⭐⭐)

PYTHON
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']])
TEXT 📖 للعرض فقط
> **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

▶ مثال

TEXT 📖 للعرض فقط
> **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 (الصعوبة ⭐)

PYTHON
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
TEXT 📖 للعرض فقط
> **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) جمع وطرح التواريخ

▶ مثال

TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) واتباع الخطوات. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

: حسابات فارق الوقت (الصعوبة ⭐⭐)

PYTHON
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)
TEXT 📖 للعرض فقط
> **الإخراج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). خادم Piston لا يحتوي على pandas مثبته مسبقاً. يرجى تثبيته محلياً (`pip install pandas`) واتباع الخطوات. القيم الفعلية قد تختلف قليلاً حسب إصدار pandas.

7. نطاق التاريخ والتردد

(1) توليد تسلسلات التواريخ

▶ مثال

TEXT 📖 للعرض فقط
> **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.

: نطاق التاريخ لتوليد التاريخ (الصعوبة ⭐⭐)

PYTHON
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)
TEXT 📖 للعرض فقط
> **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) ▶ نظام أنواع التاريخ والوقت

100%
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]
TEXT 📖 للعرض فقط
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.

▶ مثال

TEXT 📖 للعرض فقط
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.

: سير عمل تحليل السلاسل الزمنية الكامل (الصعوبة ⭐⭐⭐)

PYTHON
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}")
TEXT 📖 للعرض فقط
> **الخرج:** قم بالتشغيل في بيئة Python محلية (pandas 2.x). لا يحتوي خادم Pandas على pandas مثبته مسبقاً. يرجى تثبيتها محلياً (`pip install pandas`) والمتابعة. قد تتغير القيم الفعلي قليلاً حسب إصدار pandas.

❓ أسئلة شائعة

س كيف أحدد الصيغة لـ to_datetime؟
ج يتم الكشف تلقائيًا عن صيغة ISO (2024-01-15)، لذا لا حاجة لمعامل الصيغة. للصيغ غير القياسية، استخدم معامل الصيغة: pd.to_datetime(s, format='%d/%m/%Y'). أكواد تنسيق strftime في بايثون: %Y للسنة، %m للشهر، %d لليوم، %H للساعة، %M للدقيقة، %S للثانية. تحديد الصيغة أسرع بـ 5-10 مرات من الكشف التلقائي.
س هل .dt مشابه لـ .str؟
ج نعم — .str هو واصف النصوص و .dt هو واصف التاريخ والوقت. كلاهما يستخدمان صيغة .accessor.طريقة()، وكلاهما يتخطيان القيم NaN/NaT تلقائيًا، ويدعمان تسلسل الطرق. .str يعمل على أعمدة النصوص بينما .dt يعمل على أعمدة التاريخ والوقت.
س ما العمليات التي يدعمها Timedelta؟
ج Timestamp ± Timedelta = Timestamp (إضافة/طرح التاريخ). Timestamp - Timestamp = Timedelta (فرق التاريخ). Timedelta ± Timedelta = Timedelta (إضافة/طرح المدة). Timedelta × int = Timedelta (ضرب المدة). Timedelta + Timedelta = Timestamp غير مدعوم (لأنه سيكون بلا معنى).
س ما الفرق بين التكرار D و B؟
ج D = يوم تقويمي (يشمل عطلات نهاية الأسبوع)، B = يوم عمل (يتخطى عطلات نهاية الأسبوع). date_range(freq='D') يولّد كل يوم، بينما bdate_range() أو freq='B' يولّد أيام العمل فقط. للتكرار الشهري، MS = بداية الشهر، M = نهاية الشهر. اختيار التكرار الخاطئ يمكن أن يؤدي إلى نتائج إعادة تعيين مختلفة تمامًا.
س كيف أتعامل مع المناطق الزمنية؟
ج استخدم tz_localize لتعيين المنطقة الزمنية و tz_convert للتحويل بين المناطق الزمنية: df.index.tz_localize('UTC').tz_convert('Asia/Shanghai'). يستخدم Pandas مكتبات المناطق الزمنية pytz/dateutil. سير عمل شائع: قراءة الطوابع الزمنية بالتوقيت العالمي → التحويل إلى المنطقة الزمنية المحلية → التجميع حسب التاريخ المحلي.
س ما هو NaT؟
ج NaT (ليس وقتًا) هو القيمة المفقودة لأنواع التاريخ والوقت، يعادل NaN. pd.to_datetime(errors='coerce') يحول التواريخ غير الصالحة إلى NaT. أي عملية تشمل NaT تنتج NaT (مشابه لـ NaN). استخدم pd.isna() / pd.notna() للكشف عنه.
س ما الفرق بين Period و Timestamp؟
ج Timestamp هو نقطة في الزمن (2024-01-15 10:30:00)، بينما Period هو مدة زمنية (يناير 2024). يحتوي Period على سمات start_time و end_time. استخدم Period للتقارير الشهرية/الفصلية و Timestamp لطوابع الأحداث. resample يولّد كائنات Period، بينما rolling يتطلب Timestamp.

📖 ملخص


📝 تمارين

  1. تمرين أساسي (مستوى الصعوبة ⭐): إنشاء سلسلة (Series) تحتوي على نصوص تاريخ، تحليلها باستخدام to_datetime، استخراج الشهر ويوم الأسبوع، وعد سجلات كل شهر.
  2. تمرين متوسط (مستوى الصعوبة ⭐⭐): إنشاء إطار بيانات (DataFrame) لبيانات المبيعات اليومية لمدة 30 يومًا (مع مؤشر زمني DatetimeIndex)، استخدام dt لاستخراج is_weekend، مقارنة متوسط المبيعات بين أيام الأسبوع وعطلات نهاية الأسبوع، وحساب Timedelta لمعرفة المدة المنقضية منذ يوم أعلى مبيعات.
  3. تمرين تحدي (مستوى الصعوبة ⭐⭐⭐): محاكاة بيانات مبيعات مقهى لمدة 90 يومًا وإكمال ما يلي: تحليل باستخدام to_datetimeset_index → استخراج الشهر/الربع/يوم الأسبوع باستخدام dt → ملخص شهري باستخدام groupby → حساب نسبة النمو من شهر لآخر → إيجاد أفضل يوم من أيام الأسبوع أداءً.

← Previous: String Operations · Next: Advanced Time Series →

Web-Tutorial.com

فريق Web-Tutorial التقني

منصة دروس برمجية يديرها عدة مطورين. كل درس يتم كتابته ومراجعته بواسطة مطورين متخصصين في المجال. نعمل على ضمان دقة وموثوقية المحتوى — إذا لاحظت أي مشكلة، فيرجى إخبارنا.

100%