pandas dataframe 时间字段 diff 函数

pandas 是数据处理的利器,非常方便进行表格数据处理,用过的人应该都很清楚,没接触的可以自行查阅pandas 官网。

需求介绍

最近在使用 pandas 的过程中碰到一个问题,需要计算数据中某时间字段下一行相对上一行的时间差,之前有用过 dataframe 的 diff 函数,但是官方的教程里只介绍了数值字段的操作,即结果为当前行减去上一行的差值,所以直观的以为时间字段无法进行此项操作。于是我使用了最原始的方式,循环遍历 dataframe 每一行,逐行求时间差,将其存入数组中,最后此数组即为结果。

解决方案

今天,再看代码的时候,想到为什么不尝试一下 diff 对于时间字段到底会得到什么结果呢?于是尝试了一下,并发现了些新东西,本文就将这个过程记录一下。

数据存在 csv 文件中,内容如下:

time 2020-02-01 8:00 2020-02-01 8:10 2020-02-01 8:20 2020-02-01 8:30 2020-02-01 8:40 2020-02-01 9:00 2020-02-01 9:10 2020-02-01 9:40 2020-02-01 10:00 2020-02-02 10:00

读取文件,并进行 diff 操作,代码段如下:

import pandas as pd df = pd.read_csv('/your/file/path.csv', parse_dates=['time']) time_diff = df['time'].diff() print(time_diff)

其中 read_csv 为从硬盘中读取文件,parse_dates=['time'] 表示将 time 字段解析为时间。得到如下结果:

0 NaT 1 0 days 00:10:00 2 0 days 00:10:00 3 0 days 00:10:00 4 0 days 00:10:00 5 0 days 00:20:00 6 0 days 00:10:00 7 0 days 00:30:00 8 0 days 00:20:00 9 1 days 00:00:00 Name: time, dtype: timedelta64[ns]

从中我们可以看出, diff 操作对于时间字段确实有效,并真实的得到了上下行之间的时间差,只是使用 timedelta64[ns] 进行存储,而不是我们通常想到的秒。这样我们的问题就变的简单了,只需要将结果中的 timedelta64[ns] 类型转为秒数就可以了,之前从未接触过 timedelta64[ns] 字段,如何转呢?google 了一下,找到一个非常简单的解决方案,只需要将 timedelta64[ns] 强制转为 timedelta64[s] 即可,如下:

time_diff = time_diff.astype('timedelta64[s]') print(time_diff)

结果如下:

0 NaN 1 600.0 2 600.0 3 600.0 4 600.0 5 1200.0 6 600.0 7 1800.0 8 1200.0 9 86400.0 Name: time, dtype: float64

可以看到,我们已经得到了以秒数为单位的上下行时间差,达到了想要的效果。

One more thing

我司推出了悟空流程化数据处理平台,访问地址:https://wk.phitrellis.com/,无需复杂的 Excel 公式和编程,即可完成上述计算时间差以及其他常用数据分析操作(包含100+常用操作和如站点数据处理等业务类操作),并可像流程图一样实现链式操作,欢迎尝试并提出宝贵意见!

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfjdd.html