绘制熊猫时间增量

Posted

技术标签:

【中文标题】绘制熊猫时间增量【英文标题】:Plotting pandas timedelta 【发布时间】:2014-06-25 23:19:04 【问题描述】:

我有一个 pandas 数据框,它有两个 datetime64 列和一个 timedelta64 列,这是两列之间的差异。我正在尝试绘制 timedelta 列的直方图,以可视化两个事件之间的时间差异。

但是,仅使用 df['time_delta'] 会导致: TypeError: ufunc add cannot use operands with types dtype('<m8[ns]') and dtype('float64')

尝试将 timedelta 列转换为:float--> df2 = df1['time_delta'].astype(float) 结果是: TypeError: cannot astype a timedelta from [timedelta64[ns]] to [float64]

如何创建 pandas timedelta 数据的直方图?

【问题讨论】:

你最后是怎么画出来的?我无法简单地绘制具有值数据类型 timedelta64 的系列。错误提示“没有要绘制的数字数据”! 【参考方案1】:

这里是转换时间增量的方法,文档是here

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

部门会给出准确的repr

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

【讨论】:

完美。谢谢!在寻找 from_timedelta 时,我完全跳过了 to_timedelta 部分... 嗯......所以这些是转换时间增量的一些方法......但问题是询问绘制时间增量信息的方法。需要详细说明吗?? 您可以将timedelts转换为float或string转换为plot;目前不支持这些;虽然可以通过来自社区的拉取请求【参考方案2】:

您可以使用 numpy timedelta 数据类型绘制漂亮的直方图。

例如:

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

将以秒为单位生成时间增量的直方图。要改为使用分钟,您可以这样做:

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

或使用[m]timedelta。

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

以下是您可能需要的其他时间增量类型(来自the docs)的列表,具体取决于您需要的分辨率:

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]

【讨论】:

timedelta64[s]timedelta64[m] 中的 sm 是什么? 它们表示 timedelta s 的准确度是秒,m 在这种情况下是分钟。请记住,当您转换为更高的单位时,这些将被削减而不是四舍五入。 我认为@mattb 指的是代码无法编译的事实。我相信应该是df['time_delta'].astype("timedelta64[m]") .astype('timedelta64[m]') 似乎在一分钟后放弃了小数点。即 2.4 分钟变为 2 分钟【参考方案3】:

怎么样

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

...? (根据您的需要/您的数据,您可以使用secondsmicrosecondsnanoseconds 代替days)。

【讨论】:

并添加例如.apply(lambda x: x/3600) 之前 .hist() 如果您需要与其他单位合作。【参考方案4】:

另一种方法(对我有用)是简单地除以 Timedelta

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

【讨论】:

以上是关于绘制熊猫时间增量的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫折线图中绘制多列[重复]

使用日期时间绘制切片熊猫数据框时出现 KeyError

在 matplotlib 中绘制熊猫日期

在熊猫的时间线上绘制时间段

如何在绘制熊猫系列的同时标记新年的开始?

如何绘制熊猫数据框的多列