Вот корректировка, которая преобразуется в десятичные минуты, которые должны соответствовать обучению:
import pandas as pd
import numpy as np
from datetime import datetime
col = pd.Series(['5:17', '05:30', np.NaN, '12:30:10'])
def to_minutes(t):
if pd.isna(t):
return t
if t.count(':')==2:
t = [int(s) for s in t.split(':')]
return 60*t[0] + t[1] + 1.0/60*t[2]
if t.count(':')==1:
t = [int(s) for s in t.split(':')]
return 60*t[0] + t[1]
col_converted = [to_minutes(t) for t in col]
print(col_converted)
Вывод:
[317, 330, nan, 750.1666666666666]
Что касается вашего комментария, который вы просто хотите преобразовать в целое число для scikit.learn, вы ДОЛЖНЫ конвертировать в общий набор единиц. Вы не можете просто бросить вместе преобразованные целые числа. Если вы это сделаете, вы изменили переменную непрерывный на переменную ordinal , потому что вы разрушили линейность. Если вы не хотите, чтобы переменная ordinal не делала этого. Например, если мы посмотрим на 10-минутные приращения через часовую границу, вы получите что-то вроде этого:
from matplotlib import pyplot as plt
col = pd.Series(['5:00', '05:10', '5:20', '5:30', '5:40', '5:50', '6:00', '6:10', '6:20',
'6:30', '6:40', '6:50'])
def to_minutes(t):
if pd.isna(t):
return t
if t.count(':')==2:
t = [int(s) for s in t.split(':')]
return 60*t[0] + t[1] + 1.0/60*t[2]
if t.count(':')==1:
t = [int(s) for s in t.split(':')]
return 60*t[0] + t[1]
def to_int(t):
return int(t.replace(':',''))
true_mins = [to_minutes(t) for t in col]
skewed_time = [to_int(t) for t in col]
print(true_mins)
print(skewed_time)
plt.plot(true_mins, skewed_time)
plt.xlabel('actual minutes')
plt.ylabel('bogus time')
plt.show()