2016-02-14 13 views
6

Mam dostęp tylko do odczytu do bazy danych, które kwerendy i odczytu w ramce danych Pandy przy użyciu pymssql. Jedna ze zmiennych zawiera daty, z których niektóre są przechowywane o północy 01 stycznia 0001 (tj. 0001-01-01 00: 00: 00.0000000). Nie mam pojęcia, dlaczego te daty powinny być włączone - o ile mi wiadomo, nie są one uznawane przez SQL Server jako poprawna data i prawdopodobnie wynikają z domyślnego wprowadzenia danych. Ale z tym właśnie muszę pracować. To może być odtworzony jako dataframe następująco:Jak zapobiec funkcji pandas.to_datetime() przed konwersją 0001-01-01 na 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 wygląda następująco:

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 

... z następujących dtypes:

print(tempDF.dtypes) 

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

Ja jednak rutynowo datę konwersji pola w ramce danych do formatu datetime za pomocą:

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

Jednak przez przypadek zauważyłem, że data 0001-01-01 jest konwertowana na 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 

Zdaję sobie sprawę, że daty w oryginalnej bazie danych są nieprawidłowe, ponieważ SQL Server nie widzi 0001-01-01 jako daty prawidłowej. Ale przynajmniej w formacie 0001-01-01 takie brakujące dane są łatwe do zidentyfikowania w mojej ramce danych Pandy. Jednak, gdy pandas.to_datetime() zmienia te daty, tak że mieszczą się w możliwym zakresie, bardzo łatwo jest pominąć takie odstające wartości.

Jak mogę się upewnić, że pd.to_datetime nie interpretuje nieprawidłowo dat odstępu?

Odpowiedz

4

Jeśli podasz format, terminy te nie zostaną uznane:

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] 

Domyślnie będzie błędów, ale przekazując errors='coerce', są one konwertowane na wartości NAT (coerce=True dla starszych wersji Pandy).

Powodem pand konwertuje te "0001-01-01" odjazdu "2001-01-01" bez podania format, dlatego jest to zachowanie dateutil:

In [32]: import dateutil 

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

Idealny. Dzięki za rozwiązanie i dodatkowe uzasadnienie. – user1718097

Powiązane problemy