pandas

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+常用操作和如站点数据处理等业务类操作),并可像流程图一样实现链式操作,欢迎尝试并提出宝贵意见!

pandas dataframe 时间字段 diff 函数的更多相关文章

  1. mysql 时间字段的函数 timestamp

    Mysql 里格式 时间字段的函数 DATE_FORMAT unix_timestamp - 墨墨修行的日志 - 网易博客http://jjuanxi.blog.163.com/blog/static ...

  2. SQLITE 时间字段操作函数

    SQLite中的时间日期函数 这是我学习SQLite时做的笔记,参考并翻译了Chris Newman写的<SQLite>中的<Working with Dates and Times ...

  3. Python时间处理,datetime中的strftime/strptime+pandas.DataFrame.pivot_table(像groupby之类 的操作)

    python中datetime模块非常好用,提供了日期格式和字符串格式相互转化的函数strftime/strptime 1.由日期格式转化为字符串格式的函数为: datetime.datetime.s ...

  4. pandas DataFrame apply()函数(1)

    之前已经写过pandas DataFrame applymap()函数 还有pandas数组(pandas Series)-(5)apply方法自定义函数 pandas DataFrame 的 app ...

  5. pandas DataFrame apply()函数(2)

    上一篇pandas DataFrame apply()函数(1)说了如何通过apply函数对DataFrame进行转换,得到一个新的DataFrame. 这篇介绍DataFrame apply()函数 ...

  6. pandas DataFrame.shift()函数

    pandas DataFrame.shift()函数可以把数据移动指定的位数 period参数指定移动的步幅,可以为正为负.axis指定移动的轴,1为行,0为列. eg: 有这样一个DataFrame ...

  7. pandas DataFrame applymap()函数

    pandas DataFrame的 applymap() 函数可以对DataFrame里的每个值进行处理,然后返回一个新的DataFrame: import pandas as pd df = pd. ...

  8. 【跟着stackoverflow学Pandas】add one row in a pandas.DataFrame -DataFrame添加行

    最近做一个系列博客,跟着stackoverflow学Pandas. 以 pandas作为关键词,在stackoverflow中进行搜索,随后安照 votes 数目进行排序: https://stack ...

  9. 如何通过Elasticsearch Scroll快速取出数据,构造pandas dataframe — Python多进程实现

    首先,python 多线程不能充分利用多核CPU的计算资源(只能共用一个CPU),所以得用多进程.笔者从3.7亿数据的索引,取200多万的数据,从取数据到构造pandas dataframe总共大概用 ...

随机推荐

  1. Swiper 在IE9 及其他浏览器使用

    Swiper 在IE9 及其他浏览器使用 前言 昨天遇到一个问题,swiper 使用版本是3.4.2 除了Ie9浏览器外其他浏览器都正常,IE9 无法轮播,执行控制台报错源码问题.没办法,只能降级兼容 ...

  2. org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null

    通过这个简单的案例,手把手教给你分析异常信息(适合初学者看) org.springframework.dao.InvalidDataAccessApiUsageException: The given ...

  3. 安装了高版本OS X 之后无法使用MacPorts的port命令

    安装了高版本OS X 之后无法使用MacPorts的port命令 pod update提示: Current platform "darwin 14" does not match ...

  4. NX二次开发-C#使用DllImport调用libufun.dll里的UF函数(反编译.net.dll)调用loop等UF函数

    在写这篇文章的时候,我正在头晕,因为下班坐车回家,有些晕车了.头疼的要死.也吃不下去饭. 版本:NX11+VS2013 最近这一年已经由C++过度到C#,改用C#做应用程序开发和NX二次开发. C#在 ...

  5. java安全编码指南之:死锁dead lock

    目录 简介 不同的加锁顺序 使用private类变量 使用相同的Order 释放掉已占有的锁 简介 java中为了保证共享数据的安全性,我们引入了锁的机制.有了锁就有可能产生死锁. 死锁的原因就是多个 ...

  6. 2020.09 问题总结(Oracle-->MySQL、Maven、JSP-->Thymeleaf、Druid)

    2020.09 问题总结(Oracle-->MySQL.Maven.JSP-->Thymeleaf.Druid) 数据库建表 Oracle 转 MySQL 问题 Oracle MySQL ...

  7. 使用Redis做消息队列

    基于内存的单线程数据库,使Redis的线程安全性极高.而Redis的双向链表数据类型(List)天生就可作为消息队列存储消息. 在这里就不说消息队列的等等一些优点.但是补充一下Redis的List类型 ...

  8. Python基础-列表、元组、字典、字符串(精简解析)

    一.列表 =====================================================1.列表的定义及格式: 列表是个有序的,可修改的,元素用逗号隔开,用中括号包围的序列 ...

  9. DES加解密算法(C语言实现)

    DES加密和解密算法的实现(C语言) 主要是做个记录,害怕以后代码丢了,先放到这里了. DES再不进行介绍了,可以看上一篇的 DES 的python实现 转载请注明出处:https://www.cnb ...

  10. 达梦产品技术支持培训-day8-DM8数据库备份与还原-实操

    1.DM8的备份还原方法 Disql 工具:联机数据备份与还原,包括库备份.表空间备份与还原.表备份与还原:  DMRMAN 工具:脱机数据库备份还原与恢复: 客户端工具 MANAGER和CONSOL ...