web-dev-qa-db-fra.com

Tracer des pandas timedelta

J'ai une base de données pandas qui a deux colonnes datetime64 et une colonne timedelta64 qui représente la différence entre les deux colonnes. J'essaie de tracer un histogramme de la colonne timedelta pour visualiser les différences de temps entre les deux événements.

Cependant, si vous utilisez simplement df['time_delta'], vous obtenez: TypeError: ufunc add cannot use operands with types dtype('<m8[ns]') and dtype('float64')

Essayer de convertir la colonne timedelta en: float--> df2 = df1['time_delta'].astype(float) Entraîne: TypeError: cannot astype a timedelta from [timedelta64[ns]] to [float64]

Comment créer un histogramme de données timedelta sur les pandas?

27
DataSwede

Voici des façons de convertir timedeltas, les documents sont ici

In [2]: pd.to_timedelta(np.arange(5),unit='d')+pd.to_timedelta(1,unit='s')
Out[2]: 
0   0 days, 00:00:01
1   1 days, 00:00:01
2   2 days, 00:00:01
3   3 days, 00:00:01
4   4 days, 00:00:01
dtype: timedelta64[ns]

Convertir en secondes (est une conversion exacte)

In [3]: (pd.to_timedelta(np.arange(5),unit='d')+pd.to_timedelta(1,unit='s')).astype('timedelta64[s]')
Out[3]: 
0         1
1     86401
2    172801
3    259201
4    345601
dtype: float64

Convertir en utilisant astype arrondira à cette unité

In [4]: (pd.to_timedelta(np.arange(5),unit='d')+pd.to_timedelta(1,unit='s')).astype('timedelta64[D]')
Out[4]: 
0    0
1    1
2    2
3    3
4    4
dtype: float64

Division donnera un repr exact

In [5]: (pd.to_timedelta(np.arange(5),unit='d')+pd.to_timedelta(1,unit='s')) / np.timedelta64(1,'D')
Out[5]: 
0    0.000012
1    1.000012
2    2.000012
3    3.000012
4    4.000012
dtype: float64
38
Jeff

Vous pouvez tracer des histogrammes Nice en utilisant les types de données numpy timedelta.

Par exemple:

df['time_delta'].astype(timedelta64[s]).plot.hist()

produira un histogramme des deltas de temps en secondes. Pour utiliser les minutes à la place, vous pouvez faire ceci:

(df['time_delta'].astype(timedelta64[s]) / 60).plot.hist()

ou utilisez [m] timedelta.

df['time_delta'].astype(timedelta64[m]).plot.hist()

Voici la liste des autres types de delta temporel (de les docs ) que vous pourriez souhaiter, en fonction de la résolution requise:

Code    Meaning Time span (relative)    Time span (absolute)
h   hour    +/- 1.0e15 years    [1.0e15 BC, 1.0e15 AD]
m   minute  +/- 1.7e13 years    [1.7e13 BC, 1.7e13 AD]
s   second  +/- 2.9e11 years    [2.9e11 BC, 2.9e11 AD]
ms  millisecond +/- 2.9e8 years [ 2.9e8 BC, 2.9e8 AD]
us  microsecond +/- 2.9e5 years [290301 BC, 294241 AD]
ns  nanosecond  +/- 292 years   [ 1678 AD, 2262 AD]
ps  picosecond  +/- 106 days    [ 1969 AD, 1970 AD]
fs  femtosecond +/- 2.6 hours   [ 1969 AD, 1970 AD]
as  attosecond  +/- 9.2 seconds [ 1969 AD, 1970 AD]
1
AlexG