أعطت isnat القناع [False,True] لتاريخ معلوم يليه NaT، وكذلك لمدة معلومة يليها NaT. لكن تمرير مصفوفة float64 بالقيم [101,NaN] رفع TypeError. سنحفظ نوع المدخل والخطأ مع القناع الناجح.
علامة زمنية ونوع المدخل
تفحص isnat قيمة NaT في بيانات التاريخ أو المدة؛ وتعيد قناعًا منطقيًا. [1]
تقبل بيانات datetime64 وtimedelta64 علامة NaT. [2] نضع العلامة صراحة في موضع معروف من كل مدخل زمني، دون تقدير تاريخ أو مدة تعوضها.
اختبرنا NumPy 2.3.5 وCPython 3.12.14. جميع مدخلاتنا متجهات بطول اثنين وبأنواع معلنة. لا نستبدل نوع التاريخ بنصوص عامة أو نوع المدة بمصفوفة أعداد صحيحة ثم نفترض أن الفحص سيقبلها.
نسجل ثلاث معلومات معًا: اسم الدالة، ونوع المصفوفة، ومخرج النداء أو خطأه. القناع [False,True] وحده لا يخبرنا أي الفحوص استعملنا أو أي عائلة بيانات دخلت إليه.
وTrue هنا جواب الفحص عن العلامة في موضعها. لا تمنحنا تاريخًا صحيحًا بدل المفقود، ولا تحدد سبب الغياب أو صلاحية اليوم لتقويم جهة.
تاريخ ومدة بالقناع نفسه
أنشأنا d=np.array(["2032-04-10","NaT"],dtype="datetime64[D]"). تاريخ أبريل مؤلف، وD وحدة اليوم المعلنة؛ الشكل (2,) ونوع المدخل datetime64[D]. أعادت np.isnat(d) مصفوفة bool بالشكل (2,) والقيم [False,True].
الموضع الأول هو التاريخ المعلوم، والثاني علامة NaT. False تخص الأول، وTrue تخص الثاني. لا نرتب القناع مستقلًا عن المدخل حتى لا ننسب علامة الغياب إلى التاريخ الذي بقي معلومًا.
ثم أنشأنا t=np.array([101,"NaT"],dtype="timedelta64[D]"). الأول مدة معلنة من 101 يوم، والثاني مدة NaT. أعادت np.isnat(t) القيم [False,True] أيضًا، بمصفوفة bool من الشكل نفسه.
اتفق القناعان، لكن النوعين الأصليين مختلفان: تاريخ ومدة. لا نحفظ القناع وحده بوصفه دليلًا على أن المدخلين يتحدثان عن الشيء نفسه؛ نحتفظ باسم النوع والوحدة مع كل سجل.
راجعنا نوع المدخلين وشكلهما وبايتاتهما قبل النداء وبعده؛ بقيت ثابتة. لم تصبح NaT تاريخ أبريل أو مدة 101 يومًا بسبب وجود True، ولم نحذف العنصر الثاني من أحد المتجهين.
الرسم يضع كل نوع في صف مستقل مع مدخله وقناعه المسجل. تطابق القناع يوضح جواب السؤال نفسه عن العلامة، ويترك اختلاف عائلة البيانات ظاهرًا.
تحكم عائم وخطأ مسجل
أنشأنا f=np.array([101.0,float("nan")],dtype=np.float64)، بالشكل (2,). هنا النوع float64، وفي الموضع الثاني NaN عددية؛ لم ننشئ تاريخًا أو مدة في هذا التحكم.
استدعينا np.isnat(f)، فوقع TypeError من builtins.TypeError. حفظنا رسالة الخطأ في سجل التنفيذ، ولم نحصل على مصفوفة bool من هذا النداء. سجل الخطأ ليس قناعًا كله False ولا نتيجة True للعنصر المفقود.
وتفحص isnan قيمة NaN عنصرًا بعنصر. [3] في نداء مستقل np.isnan(f) رجعت [False,True]، بمصفوفة bool والشكل (2,). سجّلنا اسم هذا الفحص إلى جانب القناع.
إذن توافق الشكل المكتوب للقناع الناجح مع قناع التاريخ والمدة لا يعني أن isnat قبلت المدخل العائم. نحتاج معرفة أن نداء isnan هو الذي أعاد القناع على f، وأن نداء isnat على f فشل.
بقيت بايتات f ونوعها وشكلها ثابتة عبر محاولة الخطأ والفحص الناجح. لم نغير NaN إلى NaT أو نعيد تفسيرها بوصفها قيمة زمنية كي نحصل على جواب آخر.
لم نستدعِ isnan على المصفوفتين الزمنيتين، ولم نفحص اللانهاية أو isfinite. ننسب كل نتيجة إلى المدخل والدالة اللذين شغلناهما فعلًا، ونترك الحالات الأخرى خارج الاستنتاج.

المحاولات والعودات والعناصر
بنينا 17 مجموعة. تواريخها من 2032-04-10 إلى 2032-04-26، يومًا بعد يوم؛ ومددها من 101 إلى 117 يومًا. لكل مجموعة متجه تاريخ مع NaT، ومتجه مدة مع NaT، ومتجه float64 يحمل العدد المعلن مع NaN.
صارت المدخلات 17×3=51 مصفوفة. حفظنا نوع كل منها وشكلها وبايتاتها، واختلفت تمثيلاتها البايتية. لا نسمي التاريخ والمدة والعدد العائم ثلاثة قياسات متكافئة لمجرد مشاركتها في مجموعة تدريب واحدة.
لكل مجموعة أربعة نداءات: isnat على التاريخ، وعلى المدة، وعلى العائم؛ ثم isnan على العائم. العدد 17×4=68 محاولة. نجحت ثلاثة نداءات في كل مجموعة، وصار مجموع العودات الناجحة 51.
كل عودة ناجحة مصفوفة bool من عنصرين، فحفظنا 51×2=102 قيمة منطقية. أما محاولات isnat على float64 فصارت 17 سجل TypeError؛ لا تدخل هذه السجلات في عدد القيم المنطقية أو العودات الناجحة.
حدد المرجع موضع العلامة المعلنة في المدخلين الزمنيين، واستعمل تقويم Python للتواريخ المعلومة وmath.isnan لعلامة المدخل العائم. توقع القناع [False,True] في المسارات الناجحة، والخطأ في مسار isnat العائم، قبل تشغيل النداءات. لم يستعمل دالة قناع NumPy لتوليد المتوقع.
وافقت النتائج المرجع، وبقيت الأنواع والأشكال والبايتات ثابتة. راجعنا المدخلات المعلنة أيضًا؛ إثبات ثبات البايتات بعد النداء لا يعوض التحقق من أن النوع والشكل والعلامة دخلت كما وصفناها.
اقتصر الاختبار على وحدة اليوم والمدخلات المذكورة والإعدادات الافتراضية. لم نفحص مدخلًا مفردًا أو بلا محاور أو وحدة أخرى أو object أو نصوصًا أو out أو where مخصصًا أو all أو any أو مساواة NaT أو عمليات زمنية أو تحويلًا أو تعويضًا أو حذفًا أو مناطق زمنية أو تقويم عمل أو أداءً أو إصدارًا آخر.
| Input dtype | Call | Outcome |
|---|---|---|
| datetime64[D] | isnat | [False,True] |
| timedelta64[D] | isnat | [False,True] |
| float64 | isnat | TypeError |
| float64 | isnan | [False,True] |
للتوسع: حالة القيمة المفقودة.
المراجع
أُعدّ هذا المقال بمساعدة الذكاء الاصطناعي، وخضع لمراجعة ذاتية بالأداة نفسها. لا يُنسب إلى مراجع بشري أو خبير مستقل. منهجية المحتوى.
