У меня есть кадр данных pandas
с несколькими столбцами строк, представляющих даты, с пустыми строками, представляющими отсутствующие даты. Напримерpandas конвертировать строки столбцов в datetime, что позволяет пропустить, но не является недопустимым
import numpy as np
import pandas as pd
# expected date format is 'm/%d/%Y'
custId = np.array(list(range(1,6)))
eventDate = np.array(["06/10/1992","08/24/2012","04/24/2015","","10/14/2009"])
registerDate = np.array(["06/08/2002","08/20/2012","04/20/2015","","10/10/2009"])
# both date columns of dfGood should convert to datetime without error
dfGood = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
Я пытаюсь:
- эффективно преобразовать столбцы, где все строки являются допустимой датой или пустыми в столбцы типа
datetime64
(сNaT
для пустого) - Поднять
ValueError
когда-либо непустая строка не соответствует ожидаемому формату,
Пример того, где ValueError
должны быть подняты:
# 2nd string invalid
registerDate = np.array(["06/08/2002","20/08/2012","04/20/2015","","10/10/2009"])
# eventDate column should convert, registerDate column should raise ValueError
dfBad = pd.DataFrame({'custId':custId, 'eventDate':eventDate, 'registerDate':registerDate})
Эта функция делает то, что я хочу на уровне элемента:
from datetime import datetime
def parseStrToDt(s, format = '%m/%d/%Y'):
"""Parse a string to datetime with the supplied format."""
return pd.NaT if s=='' else datetime.strptime(s, format)
print(parseStrToDt("")) # correctly returns NaT
print(parseStrToDt("12/31/2011")) # correctly returns 2011-12-31 00:00:00
print(parseStrToDt("12/31/11")) # correctly raises ValueError
Однако, у меня есть read что строковые операции не должны быть np.vectorize
-d. Я думал, что это может быть сделано эффективно, используя pandas.DataFrame.apply
, как:
dfGood[['eventDate','registerDate']].applymap(lambda s: parseStrToDt(s)) # raises TypeError
dfGood.loc[:,'eventDate'].apply(lambda s: parseStrToDt(s)) # raises same TypeError
Я предполагаю, что TypeError
что-то делать с моей функцией возврата различных dtype
, но я хочу, чтобы воспользоваться динамической типизации и замените строку на datetime (если ValueError не поднимается) ... так как я могу это сделать?
Вы можете просто использовать 'pd.to_datetime' с параметром' errors = 'coerce'' так 'pd.to_datetime (x, errors =' coerce ')' где 'x' является вашим столбцом df – EdChum
@EdChum спасибо, но' pd.to_datetime (dfBad ['registerDate'], errors = 'coerce') 'не поднимает' ValueError', и я ищу, чтобы поднять 'ValueError' на недопустимые строки даты. Установка 'errors = 'coerce'' предотвращает это. – C8H10N4O2
Но дело в том, что вы получите 'np.NaT' (не время) для недопустимых или пустых строк, и вы можете отфильтровать их с помощью' dropna' – EdChum