কম্পিউটার টিউটোরিয়াল

পাইথন প্রোগ্রাম: সিরিজ থেকে বৈধ (Valid) তারিখ (Date) ফিল্টার করুন

সমস্যা বিবরণ

একটি স্ট্রিং সিরিজ দেওয়া আছে যাতে কিছু তারিখ-রূপ স্ট্রিং রয়েছে। লক্ষ্য হলো শুধু যেসব স্ট্রিং সঠিক তারিখ ফরম্যাট (YYYY-MM-DD) এ আছে, সেগুলো ফিল্টার করে বের করা।

ইনপুট সিরিজ

0    2010-03-12
1    2011-3-1
2    2020-10-10
3    11-2-2

সমাধান ১: রেগুলার এক্সপ্রেশন (Regex) প্যাটার্ন \d{4}\W\d{2}\W\d{2} ব্যবহার করে

প্যাটার্ন: ৪ ডিজিট (বছর), নন-ওয়ার্ড ক্যারেক্টার (সেপারেটর), ২ ডিজিট (মাস), নন-ওয়ার্ড, ২ ডিজিট (দিন)।

import pandas as pd
import re

l = ['2010-03-12', '2011-3-1', '2020-10-10', '11-2-2']
data = pd.Series(l)

# লুপ দিয়ে
print("লুপ দিয়ে বৈধ তারিখ:")
for i, j in data.items():
    if re.match(r"\d{4}\W\d{2}\W\d{2}", j):
        print(i, j)

# ফিল্টার ও isin দিয়ে
result = pd.Series(filter(lambda x: re.match(r"\d{4}\W\d{2}\W\d{2}", x), data))
print("\nফিল্টার করা সিরিজ:")
print(data[data.isin(result)])

সমাধান ২: প্যান্ডাস to_datetime.errors='coerce' (আধুনিক ও শক্তিশালী)

রেজেক্সের বদলে প্যান্ডাসের বিল্ট-ইন ডেট পার্সার ব্যবহার করুন।

import pandas as pd

data = pd.Series(['2010-03-12', '2011-3-1', '2020-10-10', '11-2-2'])
# errors='coerce' অবৈধ তারিখকে NaT (Not a Time) এ রূপান্তর করে
parsed = pd.to_datetime(data, errors='coerce')
valid_mask = parsed.notna()
print("বৈধ তারিখগুলো:")
print(data[valid_mask])

আউটপুট (দুই পদ্ধতিরই)

0    2010-03-12
2    2020-10-10
dtype: object

ব্যাখ্যা

  • '2010-03-12' ✅ (YYYY-MM-DD)
  • '2011-3-1' ❌ (মাস ও দিন ১ ডিজিট)
  • '2020-10-10' ✅
  • '11-2-2' ❌ (বছর ২ ডিজিট)

সুপারিশ: pd.to_datetime(errors='coerce') রেজেক্সের চেয়ে বেশি নির্ভরযোগ্য কারণ এটি আসলে ক্যালেন্ডার তারিখ হিসেবে বৈধতা চেক করে (যেমন ফেব্রুয়ারি ৩০ অবৈধ)।

  1. পাইথন প্রোগ্রাম: সিরিজ থেকে শুধু ইন্টিজার (Integer) এলিমেন্ট ফিল্টার করুন

  2. পাইথন প্রোগ্রাম: সিরিজের বিজোড় (Odd) ইনডেক্স পজিশনগুলো র‍্যান্ডম বড় হাতের স্বরবর্ণ (Uppercase Vowels) দিয়ে রিপ্লেস করুন

  3. পাইথন প্রোগ্রাম: সিরিজে পূর্ণবর্গ সংখ্যা (Perfect Squares) ফিল্টার করুন

  4. পাইথন প্রোগ্রাম: দেওয়া সংখ্যা N-এ মোট কতটি ডিজিট (Digit) আছে তা গণনা করুন