2016-02-14 4 views
6

में कनवर्ट करने से pandas.to_datetime() फ़ंक्शन को कैसे रोकूं? मेरे पास डेटाबेस में केवल पढ़ने के लिए पहुंच है जिसे मैं क्वेरी करता हूं और pymssql का उपयोग करके पांडस डेटाफ्रेम में पढ़ता हूं। चरों में से एक में तिथियां हैं, जिनमें से कुछ 01 जनवरी 0001 को मध्यरात्रि के रूप में संग्रहीत हैं (यानी 0001-01-01 00: 00: 00.0000000)। मुझे नहीं पता कि उन तिथियों को क्यों शामिल किया जाना चाहिए - जहां तक ​​मुझे पता है, उन्हें SQL सर्वर द्वारा मान्य दिनांक के रूप में पहचाना नहीं गया है और वे शायद कुछ डिफ़ॉल्ट डेटा प्रविष्टि के कारण हैं। फिर भी, मुझे यही काम करना है।मैं 0001-01-01 से 2001-01-01

import numpy as np 
import pandas as pd 

tempDF = pd.DataFrame({ 'id': [0,1,2,3,4], 
         'date': ['0001-01-01 00:00:00.0000000', 
           '2015-05-22 00:00:00.0000000', 
           '0001-01-01 00:00:00.0000000', 
           '2015-05-06 00:00:00.0000000', 
           '2015-05-03 00:00:00.0000000']}) 

dataframe की तरह दिखता है:

print(tempDF) 
          date id 
0 0001-01-01 00:00:00.0000000 0 
1 2015-05-22 00:00:00.0000000 1 
2 0001-01-01 00:00:00.0000000 2 
3 2015-05-06 00:00:00.0000000 3 
4 2015-05-03 00:00:00.0000000 4 

... निम्नलिखित dtypes साथ:

print(tempDF.dtypes) 

date object 
id  int64 
dtype: object 
print(tempDF.dtypes) 

हालांकि, मैं नियमित रूप से तिथि परिवर्तित यह एक dataframe के रूप में इस प्रकार से निर्मित किया जा सकता है डाटाफ्रेम में डेटाटाइम का उपयोग डेटाटाइम प्रारूप में:

tempDF['date'] = pd.to_datetime(tempDF['date']) 

हालांकि, मौके से, मैंने देखा है कि 0001-01-01 दिनांक 2001-01-01 में परिवर्तित हो गया है।

print(tempDF) 

     date id 
0 2001-01-01 0 
1 2015-05-22 1 
2 2001-01-01 2 
3 2015-05-06 3 
4 2015-05-03 4 

मुझे लगता है कि मूल डेटाबेस में दिनांक सही नहीं हैं क्योंकि एसक्यूएल सर्वर कोई मान्य दिनांक के रूप में 0001-01-01 न दिखाई दें। लेकिन कम से कम 0001-01-01 प्रारूप में, ऐसे लापता डेटा को मेरे पांडस डेटाफ्रेम के भीतर पहचानना आसान है। हालांकि, जब pandas.to_datetime() इन तिथियों को बदलता है तो वे एक व्यवहार्य सीमा के भीतर झूठ बोलते हैं, ऐसे आउटलाइर्स को याद करना बहुत आसान है।

मैं कैसे सुनिश्चित कर सकता हूं कि pd.to_datetime बाहरी तिथियों को गलत तरीके से समझ नहीं पा रहा है?

उत्तर

4

आप एक format प्रदान करते हैं, इन तिथियों में मान्यता प्राप्त नहीं किया जाएगा:

In [92]: pd.to_datetime(tempDF['date'], format="%Y-%m-%d %H:%M:%S.%f", errors='coerce') 
Out[92]: 
0   NaT 
1 2015-05-22 
2   NaT 
3 2015-05-06 
4 2015-05-03 
Name: date, dtype: datetime64[ns] 

डिफ़ॉल्ट रूप से यह त्रुटि होगा, लेकिन errors='coerce' पास करके, वे नेट मूल्यों (coerce=True बड़े पांडा संस्करणों के लिए) करने के लिए परिवर्तित कर रहे हैं।

कारण पांडा इन "0001-01-01" तारीखें धर्मान्तरित करने के लिए "2001/01/01" एक format प्रदान किए बिना, क्योंकि इस dateutil के व्यवहार है:

In [32]: import dateutil 

In [33]: dateutil.parser.parse("0001-01-01") 
Out[33]: datetime.datetime(2001, 1, 1, 0, 0) 
+0

बिल्कुल सही। समाधान के लिए और अतिरिक्त तर्क के लिए धन्यवाद। – user1718097

संबंधित मुद्दे