Определите 3 следующие функции преобразования:
def strToDate(tt):
return pd.to_datetime(tt, yearfirst=True)
def strToTime(tt):
return pd.to_datetime(tt, format='%I:%M:%S.%f').time()
def strToTime2(tt):
return pd.Timestamp(float(tt), unit='s').time()
Затем прочтите свой DataFrame, передав их как преобразователи для столбцов, требующих «специализированного» преобразования:
df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
2: strToTime, 4: strToTime2, 6: strToTime2, 7: strToTime2 })
Когда вы печатаете df.info()
, затем:
- столбец 1 (дата) имеет тип datetime64 [нс] тип,
- столбец 8 ( NaN s) имеет тип float64 ,
- все остальные столбцы имеют тип объект .
Но не обманывайтесь. В Pandas тип объекта на самом деле означает «что-то отличное от числа или даты и времени».
Когда вы извлекаете отдельные значения, например, df.iloc[0,2]
, вы получите: datetime.time(11, 24, 31, 758000)
, аналогично любой ячейке из столбца 4 , 6 или 7 , поэтому они имеют только требуемый тип .
Другое решение, основанное на Timedelta
Определите функции конвертера как:
def strToDate(tt):
return pd.to_datetime(tt, yearfirst=True)
def strToTimeDelta(tt):
return pd.Timedelta(float(tt), unit='S')
Прочтите фрейм данных:
df = pd.read_csv('Input.csv', header=None, converters={ 1: strToDate,
2: pd.Timedelta, 4: strToTimeDelta, 6: strToTimeDelta, 7: strToTimeDelta })
(для преобразования столбца 2 используйте родную pandasoni c функцию pd.Timedelta ).
Затем, если вам нужно преобразовать некоторые Timedelta столбец (например, столбец 7 ) до общего количества секунд, включая дробную часть, выполнить:
df[7].dt.seconds + df[7].dt.microseconds / 1e6
Но результат чтения столбцов по умолчанию 4 , 6 и 7 - это просто float , т.е. количество секунд.
Это концептуально раз, но на самом деле:
* 10 86 * во входном файле они сохраняются как
text , после
read_csv они
float с сохранением количества секунд.
Так зачем вам преобразование этих столбцов?