2025, Oct 02 17:33
pandas में मिलिसेकंड Unix timestamp को datetime में बदलें
pandas में 1743004800000 जैसे मिलिसेकंड Unix timestamp को datetime में सही तरीके से बदलें: to_datetime में unit=ms का उपयोग करें, ValueError से बचें, सरल गाइड.
pandas में समय-संबंधी डेटा पर काम करते समय, एक आम गलती यह होती है कि संख्यात्मक Unix टाइमस्टैम्प को मानो वे पढ़ने योग्य स्ट्रिंग हों, उसी तरह पार्स करने की कोशिश करना। यदि आपके कॉलम में 1743004800000 जैसे मान हैं और आप उन्हें '%Y-%m-%d' जैसे दिनांक फ़ॉर्मैट के साथ to_datetime में भेज देते हैं, तो सीधे पार्सिंग त्रुटि मिलती है।
समस्या का सार
ऐसा डेटासेट लें, जिसमें time फ़ील्ड 1743004800000 जैसा दिखे। यह देखने में भले स्ट्रिंग लगे, पर अर्थ के स्तर पर यह मिलिसेकंड में Unix टाइमस्टैम्प है। इसे स्ट्रिंग वाले दिनांक फ़ॉर्मैट से पार्स करने की कोशिश करने पर अपवाद उठता है:
ValueError: time data "1743004800000" doesn't match format "%Y-%m-%d"
समस्या दोहराना
नीचे दिया स्निपेट एक न्यूनतम उदाहरण बनाता है और असफल कन्वर्ज़न को दिखाता है। पहचानकर्ता सामान्य रखे गए हैं, पर तर्क वास्तविक स्थिति जैसा ही है।
import pandas as pds
records = pds.DataFrame({
    "event_ts": [1743004800000, 1753004800000]
})
# गलत: मिलिसेकंड को स्ट्रिंग दिनांक फ़ॉर्मैट से पार्स करने की कोशिश
broken = records.copy()
broken["event_ts"] = pds.to_datetime(broken["event_ts"], format="%Y-%m-%d").dt.date
यह ऊपर दिखी त्रुटि देता है, क्योंकि 1743004800000 '%Y-%m-%d' वाली स्ट्रिंग नहीं है; यह एक संख्यात्मक टाइमस्टैम्प है।
ऐसा क्यों होता है
समस्या की जड़ प्रकार और अर्थ के असंगत होने में है। 1743004800000 जैसे मान समय को Unix epoch से गुज़रे मिलिसेकंड की संख्या के रूप में दर्शाते हैं, न कि स्वरूपित दिनांक स्ट्रिंग के रूप में। format आर्ग्युमेंट pandas को '2025-03-26' जैसी स्ट्रिंग पैटर्न पार्स करने को कहता है, लेकिन यहाँ इनपुट मिलिसेकंड की गिनती है, इसलिए पार्सर इसे '%Y-%m-%d' से मिला नहीं पाता।
समाधान
सही तरीका यह है कि unit पैरामीटर देकर pandas को बताया जाए कि इनपुट मिलिसेकंड में है। कन्वर्ज़न के बाद, यदि केवल कैलेंडर तारीख चाहिए, तो .dt.date से निकाल लें।
import pandas as pds
records = pds.DataFrame({
    "event_ts": [1743004800000, 1753004800000]
})
# सही: pandas को बताएं कि टाइमस्टैम्प मिलिसेकंड में हैं
clean = records.copy()
clean["event_ts"] = pds.to_datetime(clean["event_ts"], unit="ms")
# अगर सिर्फ तारीख चाहिए, तो अलग कॉलम बना लें
clean["event_date"] = clean["event_ts"].dt.date
print(clean)
परिणाम:
                event_ts  event_date
0 2025-03-26 16:00:00    2025-03-26
1 2025-07-20 09:46:40    2025-07-20
यदि आपके डेटा में समय की इकाई अलग है, तो unit उसी अनुसार बदलें।
यह क्यों महत्वपूर्ण है
समय-संबंधी बग अक्सर सूक्ष्म होते हैं, लेकिन महंगे साबित होते हैं। संख्यात्मक टाइमस्टैम्प को स्वरूपित स्ट्रिंग समझ लेने से या तो ValueError के साथ तुरंत विफलता होती है, या और भी बुरा—गलत coercion पर डेटा चुपचाप बिगड़ सकता है। इकाई स्पष्ट रखने से पार्सिंग पूर्वानुमेय रहती है, कोड स्व-विवरणात्मक बनता है, और आगे की लॉजिक गलत तारीखों पर काम करने से बचती है।
मुख्य निष्कर्ष
यदि आपके डेटासेट में समय 1743004800000 जैसी बड़ी पूर्ण संख्याओं के रूप में है, तो उन्हें मिलिसेकंड में Unix टाइमस्टैम्प मानें और unit="ms" के साथ कन्वर्ट करें। format आर्ग्युमेंट को केवल वास्तविक, पढ़ने योग्य स्ट्रिंग्स—जैसे '2025-03-26'—के लिए रखें। कन्वर्ज़न के बाद, साधारण तारीख तभी निकालें जब सच में ज़रूरत हो, बाकी कामों के लिए पूर्ण datetime संभालकर रखें।
यह लेख StackOverflow पर एक प्रश्न (लेखक: user824624) और Panda Kim के उत्तर पर आधारित है।