2025, Oct 20 15:31
pandas to_csv में date_format क्यों नहीं चलता: कारण और कामयाब समाधान
जानें क्यों pandas to_csv में date_format Python के date ऑब्जेक्ट्स पर काम नहीं करता। dtype मिसमैच, इसे datetime/Arrow में बदलकर strftime से फ़ॉर्मैट करें और सही CSV।
pandas से तारीख़ों को CSV में एक्सपोर्ट करते समय और यह उम्मीद रखते हुए कि date_format अपना काम करेगा, अक्सर मायूसी होती है, खासकर जब डेटा शुद्ध Python के date ऑब्जेक्ट्स से बना हो। फ़ॉर्मैटर चुपचाप कुछ नहीं करता और नतीजतन आपको ISO-जैसी तारीख़ें दिखती हैं। यहाँ वजह समझें और जानें कि इसे बिना अपनी डेटा पाइपलाइन की लॉजिक बदले कैसे ठीक करें।
समस्या का लक्षण
आप pandas से निर्यात के समय तारीख़ों को फ़ॉर्मैट करने के लिए कहते हैं, लेकिन आउटपुट अनुरोधित पैटर्न नहीं अपनाता:
import pandas as p
import datetime as dt
sheet = p.DataFrame([dt.datetime.now().date()])
text_csv = sheet.to_csv(date_format="%Y %b")
print(text_csv)
# आउटपुट
#,0
#0,2025-07-31
CSV कच्ची तारीख़ दिखाता है: 2025-07-31, जबकि अपेक्षित 2025 Jul था।
पर्दे के पीछे वास्तव में क्या होता है
Pandas अभी तक standalone date प्रकार का नैटिव समर्थन नहीं देता। यह NumPy पर टिका है, जिसमें एक ही 64-बिट datetime प्रकार होता है—datetime64[ns]। इसलिए साधारण date मान Object के रूप में स्टोर किए जाते हैं। यही मुख्य वजह है कि .dt एक्सेसर और to_csv में date_format जैसे datetime-सचेत फीचर ऐसी कॉलम्स पर लागू नहीं होते।
टाइप मिसमैच को दिखाना
यदि आप dtype जांचेंगे, तो असंगति तुरंत दिखेगी। एक date तो object बन जाता है, जबकि datetime को datetime64[ns] dtype मिलता है। यही फर्क फ़ॉर्मैटर को रोक देता है।
import pandas as p
from datetime import date
col = p.Series([date.today()])
print(col.dtype)
# आउटपुट
# object
.dt से फ़ॉर्मैट करने की कोशिश बताती है कि इसे datetimelike नहीं माना गया:
col.dt.strftime("%Y %b")
# ...
# AttributeError: Can only use .dt accessor with datetimelike values. Did you mean: 'at'?
समाधान और काम करने वाले उदाहरण
उपाय यह है कि पहले object-आधारित मानों को datetime-aware dtype में बदलें, फिर फ़ॉर्मैट करें। जैसे ही आपके पास datetimelike series होती है, strftime सामान्य रूप से काम करता है। उसके बाद आप फ़ॉर्मैट हुए स्ट्रिंग्स को CSV में लिख सकते हैं।
import pandas as p
from datetime import date
raw_dates = p.Series([date.today()])
formatted = p.to_datetime(raw_dates).dt.strftime("%Y %b")
print(formatted)
# आउटपुट
# 0    2025 Jul
यदि आप ऐसा प्रकार चाहते हैं जो तारीख़ों को नैटिव रूप से समझता हो, तो Arrow-backed series का इस्तेमाल करें और सीधे strftime लागू करें।
import pandas as p
from datetime import date
arrow_dates = p.Series([date.today()], dtype="date32[pyarrow]")
pretty = arrow_dates.dt.strftime("%Y %b")
print(pretty)
# आउटपुट
# 0    2025 Jul
# dtype: string[pyarrow]
यह क्यों मायने रखता है
CSV एक्सपोर्ट अक्सर सिस्टमों की सीमा पर होते हैं। यदि आपकी पाइपलाइन स्थिर तारीख़ फ़ॉर्मैटिंग पर निर्भर करती है, तो चुपचाप object-आधारित तारीख़ें लिखना डाउनस्ट्रीम पार्सिंग में अप्रत्याशित स्थितियाँ ला सकता है। यह जानना कि साधारण date मान object के रूप में स्टोर होते हैं, न कि datetimelike के रूप में, .dt ऑपरेशनों का उपयोग करते समय नाज़ुक एक्सपोर्ट और अनपेक्षित त्रुटियों से बचने में मदद करता है।
मुख्य बातें
यदि to_csv में date_format लागू नहीं हो रहा, पहले dtype जाँचें। object दिखे तो उसे datetime-aware प्रकार में बदलें, strftime के जरिए फ़ॉर्मैट करें और फिर एक्सपोर्ट करें। वैकल्पिक रूप से, शुरुआत से ही date semantics पाने के लिए Arrow-backed date series अपनाएँ। दोनों रास्ते CSV में तारीख़ों के स्वरूप पर अनुमानित और स्पष्ट नियंत्रण वापस दिलाते हैं।
यह लेख StackOverflow पर प्रश्न (लेखक: Hugo Trentesaux) और Panagiotis Kanavos के उत्तर पर आधारित है।