2017-09-13 4 views
1

J'ai des microsecondes que je veux essentiellement tronquer d'une colonne pandas. J'ai essayé quelque chose comme analyze_me['how_long_it_took_to_order'] = analyze_me['how_long_it_took_to_order'].apply(lambda x: x.replace(microsecond=0) mais à cette erreur est venu replace() takes no keyword arguments.Comment supprimer les microsecondes de timedelta

Par exemple: Je veux 00: 19: 58,582052 pour devenir 00:19:58 ou 00: 19: 58,58

enter image description here

+0

Vous devriez envisager de modifier vos données à timedelta ou un horodatage (si vous avez la date avec) à partir de la chaîne. Il n'y a pas de bonne raison de le garder comme une ficelle. Ensuite, vous pouvez utiliser l'excellent accesseur 'dt' avec la méthode' floor' pour tronquer. Vois ma réponse. –

Répondre

0

votre colonne how_long_it_took_to_order semble être une chaîne (object) DTYPE.

Donc, essayez ceci:

analyze_me['how_long_it_took_to_order'] = \ 
    analyze_me['how_long_it_took_to_order'].str.split('.').str[0] 

ou:

analyze_me['how_long_it_took_to_order'] = \ 
    analyze_me['how_long_it_took_to_order'].str.replace('(\.\d{2})\d+', r'\1') 

pour "centiseconds", comme: 00:19:58.58

+0

Cela ressemble à supprimer complètement la partie fractionnaire. – pvg

+0

@pvg, oui, c'est comme ça que j'ai compris: 'Je veux 00: 19: 58.582052 devenir 00:19:58 ou 00: 19: 58.58' – MaxU

+0

C'est un peu vague mais le titre dit 'microsecondes'. La deuxième version de la chaîne est une sans microsecondes (va jusqu'à 100). – pvg

3

Je pense que vous devez convertir votre chaîne dans un timedelta avec pd.to_timedelta et puis profitez de l'excellent accesseur dt avec la méthode floor qui tronque en fonction de la ficelle. Voici les deux premières lignes de vos données.

df['how_long_it_took_to_order'] = pd.to_timedelta(df['how_long_it_took_to_order']) 
df['how_long_it_took_to_order'].dt.floor('s') 

0 00:19:58 
1 00:25:09 

Peut arrondir au centième de seconde.

df['how_long_it_took_to_order'].dt.floor('10ms') 

0 00:19:58.580000 
1 00:25:09.100000 

Ici, je crée une une série d'timedeltas puis utilisez l'accesseur dt avec la méthode floor tronquer jusqu'à la plus proche microseconde.

d = pd.timedelta_range(0, periods=6, freq='644257us') 
s = pd.Series(d) 
s 

0   00:00:00 
1 00:00:00.644257 
2 00:00:01.288514 
3 00:00:01.932771 
4 00:00:02.577028 
5 00:00:03.221285 
dtype: timedelta64[ns] 

tronquer

s.dt.floor('s') 

0 00:00:00 
1 00:00:00 
2 00:00:01 
3 00:00:01 
4 00:00:02 
5 00:00:03 
dtype: timedelta64[ns] 

Si vous voulez tronquer au centième près d'une seconde faire:

s.dt.floor('10ms') 

0   00:00:00 
1 00:00:00.640000 
2 00:00:01.280000 
3 00:00:01.930000 
4 00:00:02.570000 
5 00:00:03.220000 
dtype: timedelta64[ns] 
+2

Son amende s'il a des ficelles.Juste le convertir en timedelta. La longueur de la chaîne sera variable mais un timedelta est exact. –

+1

Cela semble être une réponse beaucoup plus saine que la chaîne de caractères. – pvg

+0

Je pense que cette solution ne fonctionnera pas correctement car OP a les deux chaînes représentant uniquement l'heure et la date + l'heure - quelque chose comme ceci: 'pd.to_timedelta (['00: 19: 58.582052', '2014-10-26 13:51: 59.898924 ']) '- qui ne fonctionnera pas ... – MaxU