J'ai un Pandas DataFrame avec des colonnes de date. Les données sont importées à partir d'un fichier csv. Lorsque j'essaye d'adapter le modèle de régression, j'obtiens l'erreur ValueError: could not convert string to float: '2019-08-30 07:51:21
.
.
Comment puis-je m'en débarrasser?
Voici dataframe.
source.csv
ValueError Traceback (most recent call last) <ipython-input-28-bc774a9d8239> in <module> 4 rf = RandomForestRegressor(n_estimators = 1000, random_state = 42) 5 # Train the model on training data ----> 6 rf.fit(train_features, train_labels); ~/ml/env/lib/python3.7/site-packages/sklearn/ensemble/forest.py in fit(self, X, y, sample_weight) 247 248 # Validate or convert input data --> 249 X = check_array(X, accept_sparse="csc", dtype=DTYPE) 250 y = check_array(y, accept_sparse='csc', ensure_2d=False, dtype=None) 251 if sample_weight is not None: ~/ml/env/lib/python3.7/site-packages/sklearn/utils/validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator) 494 try: 495 warnings.simplefilter('error', ComplexWarning) --> 496 array = np.asarray(array, dtype=dtype, order=order) 497 except ComplexWarning: 498 raise ValueError("Complex data not supported\n" ~/ml/env/lib/python3.7/site-packages/numpy/core/numeric.py in asarray(a, dtype, order) 536 537 """ --> 538 return array(a, dtype, copy=False, order=order) 539 540 ValueError: could not convert string to float: '2019-08-30 07:51:21'
3 Réponses :
Essayez une chose comme celle-ci, après avoir lu le modèle
import datetime to_timestamp_fct = lambda x: datetime.datetime.strptime(x, '%Y-%m-%d %H:%M:%S').timestamp() model['rssi_ts'] = model['rssi_ts'].apply(to_timestamp_fct)
sa soulevant la même erreur. bien que vous appliquez ici à une seule fonctionnalité, j'ai 3 fonctionnalités avec horodatage.
Vous devez convertir la date de l'heure de la chaîne en horodatage pandas. Cela peut être fait avec la ligne suivante (tout le reste est conservé pendant que vous écrivez):
model = ( pd.read_csv("source.csv", parse_dates=['rssi_ts', 'batl_ts'], date_parser=lambda x: pd.to_datetime(x)) .assign( rssi_ts=lambda x: x.loc[:, 'rssi_ts'].astype(int) / 10 ** 9, batl_ts=lambda x: x.loc[:, 'batl_ts'].astype(int) / 10 ** 9, ts_diff=lambda x: pd.to_timedelta(x.loc[:, 'ts_diff']).astype(int) / 10 ** 9 ) )
Timestamp
Les objets créés par les arguments parse_dates
peuvent être convertis en float. p>
Modifier : il manquait un crochet.
Edit2 : pour un autre horodatage et l'heure delta.
p >
Il lit votre valeur sous forme de chaîne ... Pour que le modèle fonctionne, il doit lire qu'il a un entier ou un flottant, utilisez donc cette fonction:
model = ( pd.read_csv("source.csv", parse_dates=['rssi_ts', 'batl_ts'], date_parser=lambda x: pd.to_datetime(x)) .assign(rssi_ts=lambda x: x.loc[:, 'rssi_ts'].astype(int) / 10 ** 9)
Merci pour la réponse. Bien que cela donne maintenant l'erreur 'TypeError: float () argument doit être une chaîne ou un nombre, pas' Timestamp ''
ce sont des types: event_id int64 tsm_tuid int64 rssi_ts float64 rssi int64 batl float64 batl_ts datetime64 [ns] ts_diff object dtype: object