সমস্যা বিবরণ
একটি স্ট্রিং সিরিজ দেওয়া আছে যাতে কিছু তারিখ-রূপ স্ট্রিং রয়েছে। লক্ষ্য হলো শুধু যেসব স্ট্রিং সঠিক তারিখ ফরম্যাট (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') রেজেক্সের চেয়ে বেশি নির্ভরযোগ্য কারণ এটি আসলে ক্যালেন্ডার তারিখ হিসেবে বৈধতা চেক করে (যেমন ফেব্রুয়ারি ৩০ অবৈধ)।