2016-09-23 3 views
1

Миллионы записей данных находятся в моей информационной кадре. Мне нужно преобразовать столбцы строки в datetime. Я делаю это следующим образом:Python Pandas Отладка на to_datetime

allData['Col1'] = pd.to_datetime(allData['Col1']) 

Однако некоторые из строк не являются действительными строками DateTime, и, таким образом, я получаю ошибку значения. Я не очень хорошо разбираюсь в Python, поэтому я изо всех сил пытаюсь найти причину, почему некоторые элементы данных не конвертируются.

Мне нужен Python, чтобы показать мне номер строки, а также значение, которое не является конвертируемым, вместо того, чтобы выбрасывать бесполезную ошибку, которая ничего мне не говорит. Как я могу это достичь?

ответ

2

Вы можете использовать boolean indexing с условием, где проверить NaT значения по isnull создан to_datetime с параметром errors='coerce' - это создать NaT где недействительны Дата и время:

allData1 = allData[pd.to_datetime(allData['Col1'], errors='coerce').isnull()] 

Пример:

allData = pd.DataFrame({'Col1':['2015-01-03','a','2016-05-08'], 
         'B':[4,5,6], 
         'C':[7,8,9], 
         'D':[1,3,5], 
         'E':[5,3,6], 
         'F':[7,4,3]}) 

print (allData) 
    B C  Col1 D E F 
0 4 7 2015-01-03 1 5 7 
1 5 8   a 3 3 4 
2 6 9 2016-05-08 5 6 3 

print (pd.to_datetime(allData['Col1'], errors='coerce')) 
0 2015-01-03 
1   NaT 
2 2016-05-08 
Name: Col1, dtype: datetime64[ns] 

print (pd.to_datetime(allData['Col1'], errors='coerce').isnull()) 
0 False 
1  True 
2 False 
Name: Col1, dtype: bool 


allData1 = allData[pd.to_datetime(allData['Col1'], errors='coerce').isnull()] 
print (allData1) 
    B C Col1 D E F 
1 5 8 a 3 3 4 
+0

По какой-то причине, если один ошибка обнаружена, весь столбец сделан NaT. Есть идеи? ALLDATA [ 'GPS_DateTime'] = pd.to_datetime (ALLDATA [ 'GPS_DateTime'], ошибки = 'принуждать') errorData = ALLDATA [ALLDATA [ 'GPS_DateTime']. IsNull()] – user1035217

+0

Я думаю, что нужно поменять его : 'errorData = allData [allData ['GPS_DateTime']. isnull()]' предназначен только для проверки, поэтому сначала проверьте его, а затем конвертируйте в datetime с помощью 'allData ['GPS_DateTime'] = pd.to_datetime (allData ['GPS_DateTime' ], errors = 'coerce') ' – jezrael

+0

allData ['GPS_DateTime'] = pd.to_datetime (allData ['GPS_DateTime'], errors = 'coerce') дает целую колонку NaT – user1035217