绘制pandas时间差

72 投票
4 回答
59291 浏览
提问于 2025-04-18 05:50

我有一个 pandas 数据框,其中有两列是日期时间格式,还有一列是时间差,这个时间差是前两列的差值。我想画一个柱状图,来展示这两个事件之间的时间差。

但是,直接用 df['time_delta'] 来做,就出现了这个错误: TypeError: ufunc add cannot use operands with types dtype('<m8[ns]') and dtype('float64')

我尝试把时间差这一列转换成浮点数:float--> df2 = df1['time_delta'].astype(float),结果又出现了这个错误: TypeError: cannot astype a timedelta from [timedelta64[ns]] to [float64]

那要怎么才能画出 pandas 的时间差数据的柱状图呢?

4 个回答

5

还有一种方法(对我有效)就是直接用一个 Timedelta 来进行除法运算:

plt.hist(df['time_delta']/pd.Timedelta(minutes=1), bins=20)
17

这样怎么样

df['time_delta'].dt.days.hist()

...?(在这里你可以根据需要或数据使用 微秒纳秒 来替代 )。

41

你可以使用numpy的时间差数据类型来绘制漂亮的直方图。

比如说:

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

这段代码会生成一个以秒为单位的时间差直方图。如果你想用分钟来表示,可以这样做:

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

或者使用 [m] 时间差。

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

这里有其他一些时间差类型的列表(来自 文档),你可以根据需要的精度选择:

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]
58

这里有一些将时间差转换的方法,详细的说明可以在这里找到。

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]

转换为秒(这是一个精确的转换)

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

使用astype进行转换会四舍五入到那个单位

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

进行除法运算会得到一个精确的表示

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

撰写回答