快乐学Python,如何正确使用pandas处理时间类型的数据?

news2024/11/22 16:26:47

在日常的数据分析工作中,常常会有根据日期来对数据进行分析。比如我们需要通过用户的下单时间来分析用户在不同时间段对商品的喜好;如通过访问日志的访问时间来分析系统的访问周期和负载,为不同时间段的资源调配提供依据;如通过用户刷短视频的时间来分析用户的行为特征和工作时间和工种;由此可以看出,在数据分析中,根据日期(时间)来分析的情况还是不少的。

同时,根据数据记录方式的不同,时间的保存格式也是不同的。比如有的系统记录是按照 2024/2/1 格式记录;有的系统是按照 2024-02-01 09:31:52 的格式来记录;也有的会直接存一个时间戳(1698724307189)来记录;时间的存储格式有很多,这里我们就不再一一举例说明咯。

如果要完全实现针对不同格式的兼容,往往需要书写大量琐碎的代码。而这还只是最简单的提取年月日。其他比如时间的加减,都不是简单就能够完成的。pandas 作为数据分析最强大的工具集,自然也提供了一套非常强大的处理时间数据的工具,下面我们就一起来看看。

1、pandas 常用的时间类

  • Timestamp:代表某个时间点,比如用户下单的时间,或是访问系统的时间。
  • DatetimeIndex:代表一个时间点的序列,相当于是多个 Timestamp 构成的列表。
  • Timedelta:单个时长。比如 3 分钟,5 分钟等都算时长,时长具有不同单位。常见的有天、时、分等。
  • TimedeltaIndex:多个时长数据的序列,类似 DatetimeIndex 和 Timestamp 的关系。
  • DataOffset:时间在日历维度的偏移。比如时间是 2024 年 2 月 1 日,在日历偏移一天就是 2024 年 1 月 31 日。DataOffset 提供了多种偏移方式,比如按工作日偏移,那么周五早上 10 点偏移到下一个工作日就是下周一早上 10 点。

在 pandas 中做时间处理的时候,用的最多的是以下几个场景:

1、将各种格式的时间数据转换成 timestamp 类型。

2、使用 Timestamp 类型来获取时间的各种属性。比如日期、时间、星期几等。

3、使用 Timestamp 和 Timedelta 来做时间的计算,如加减等。比如当前时间加 3 分钟。 如果需要做日历维度的偏移,就需要和 Offset 一起使用。

4、按时间筛选 DataFrame 里面的记录。则需将时间列设置为 DateTimeIndex,然后按照普通索引的用法通过时间来筛选。

2、解析时间数据

在 Python 中,对时间数据的解析本质上就是将数据先转换为 pandas 的 Timestamp 类型,因为只有转换后才能进行后续的操作。

pandas 提供了 to_datetime 的方法来将不同类型的时间数据转换为 Timestamp 类型。

(1)字符串解析

字符串是常见的时间存储格式,to_datetime 函数几乎支持所有的主流标记法,比如

import pandas as pd


# 常见的日期+时间的表示方法

pd_time = pd.to_datetime("2023-08-29 17:17:22")

print(type(pd_time),pd_time)

# 时间简写,并用12小时制的表示方法

pd_time1 = pd.to_datetime("2023-08-29 5:17pm")

print(type(pd_time1), pd_time1)

# / 表示法

pd_time2 = pd.to_datetime("08/29/2023")

print(type(pd_time2), pd_time2)

# 结合英文月份的表示方法

pd_time3 = pd.to_datetime("Aug 29, 2023")

print(type(pd_time3), pd_time3)

执行后输出:

从上面输出可以看出 to_datetime 函数返回的都是 Timestamp 类型。 如果是中文环境,类似于“2024 年 2 月 1 日”这样的格式,也同样是可以解析的,我们可以通过 to_datetime 的自定义格式字符串来解析。比如下面的代码:

# 使用自定义格式字符串解析任意时间字符串

pd_time4 = pd.to_datetime("2024年2月1日", format="%Y年%m月%d日")

print(type(pd_time4), pd_time4)

输出如下:

(2)浮点型(整型)解析

这里就比如我们上面聊到的数据源存储是时间戳的,那我们的转换方式如下:

time_value = 1620565604

# 将数字时间戳转换为 Timestamp 类型,并指定单位为秒

pd_time5 = pd.to_datetime(time_value, unit="s")

print(type(pd_time5), pd_time5)

输出如下:

在这里有点需要注意:如果需要加入时区,我们可以使用tz_localize("Asia/Shanghai")来指定。

(3)构造Timestamp对象

# 通过单独指定年月日等信息来创建 Timestamp 对象
pd_time7 = pd.Timestamp(year=2024, month=2, day=1, hour=21)

print(type(pd_time7),pd_time7)

# 获取当前时间
pd_time8 = pd.Timestamp("now")
print(type(pd_time8),pd_time8)

输出如下:

3、获取时间内的时间属性

当我们获取到Timestamp对象后,就可以通过Timestamp对象提供的方法来获取各种时间属性了,常用的属性获取方法如下:

print("当前时间对象:", pd_time8)

print("星期几,星期一为0:", pd_time8.dayofweek) 

print("星期几,字符串表示:", pd_time8.day_name())

print("一年中的第几天:", pd_time8.dayofyear)

print("这个月的有几天:",pd_time8.daysinmonth)

print("今年是否是闰年", pd_time8.is_leap_year)

print("当前日期是否是本月最后一天", pd_time8.is_month_end)

print("当前日期是否是本月第一天", pd_time8.is_month_start)

print("当前日期是否是本季度最后一天", pd_time8.is_quarter_end)

print("当前日期是否是本季第一天", pd_time8.is_quarter_start)

print("当前日期是否是本年度最后一天", pd_time8.is_year_end)

print("当前日期是否是本年度第一天", pd_time8.is_year_start)

print("当前第几季度:", pd_time8.quarter)

print("当前的时区:", pd_time8.tz)

print("本年第几周:", pd_time8.week)

print("年:", pd_time8.year)

print("月:", pd_time8.month)

print("日:",pd_time8.day)

print("小时:", pd_time8.hour)

print("分钟:", pd_time8.minute)

print("秒:", pd_time8.second)

输出如下:

4、时间计算

简单来说,时间计算就是在当前时间后的几分钟、几小时或几秒后的时间是多少。因为时间的数据计算比较特殊,涉及到月份的天数、分钟折算成秒,需要除以60,小时折算成分钟,也需要除以60,如果自己手动计算,逻辑就会比较复杂。那么我们就可以通过pandas来进行时间计算。pandas的时间计算是通过Timestamp对象和Timedelta对象混合运算来实现的。

(1)创建Timedelta对象

①从字符串来创建

delta1 = pd.Timedelta('0.5 days')

print("半天:", delta1)

delta2 = pd.Timedelta("2 days 3 hour 20 minutes")

print("2天零3小时20分钟", delta2)

delta3 = pd.Timedelta("1 days 20:36:00")

print("1天零8小时36分钟:", delta3)

②从单元时间来创建

delta4 = pd.Timedelta(days = 1.5)

print("1天半:", delta4)

delta5 = pd.Timedelta(days = 10, hours= 9)

print("十天零九小时:", delta5)

③从时间缩写来创建

  • W:代表周、星期

  • D:代表天

  • H:代表小时

  • M:代表分钟

  • S:代表秒

delta6 = pd.Timedelta("2W3D")

print("两周零三天:", delta6)

delta7 = pd.Timedelta("6H30M12S")

print("6小时30分钟12秒:", delta7)

(2)时间计算

# 获得当前的时间

current_time = pd.Timestamp("now")

print("当前时间:", current_time)

# 获得当前时间减去两周的时间

two_week_ago = current_time - pd.Timedelta("2W")

print("两周前:", two_week_ago)

# 获得当前时间30天零7小时之后的时间

future_time = current_time + pd.Timedelta("30D7H")

print("30天零7小时之后的时间:",future_time)

执行后输出如下:

除了计算Timedelta和Timestamp外,两个Timestamp也能相减,得到一个时长:

# 创建去年国庆节上午八点的时间

national_day = pd.to_datetime("2023-10-01 08:00:00")

# 计算当前时间和国庆时间的 Timedelta

delta8 = current_time - national_day

print("距离去年国庆已经过了:", delta8)

输出为:

5、以时间为索引查询

接下来我们来看一下,针对DataFrame中的数据,我们如何利用时间来查询。

(1)准备示例数据

示例数据大家可以自行准备,可以直接新建csv文件来做模拟数据,不想做的可以公众号留言哈!

(2)设置DatetimeIndex

将示例数据加载到DataFrame中后,需要设置time字段转换为datetimeIndex。转换分两步:

第一步:将时间一列转换为Timestamp对象。

# 将 time 列转化为 Timestamp对象

df_log["time"] = pd.to_datetime(df_log["time"])

# 查看 time 列

df_log["time"]

执行之后输出:

0     2018-08-29 17:17:22.300959410

1     2018-08-29 20:59:58.841378430

2     2018-08-01 19:20:06.479644547

3     2018-08-01 17:25:58.912202131

4     2018-06-02 11:00:51.123221777

                   ...             

995   2018-11-08 11:10:13.586269568

996   2018-11-08 19:10:55.214335543

997   2018-11-08 16:54:37.687285776

998   2018-11-08 17:46:17.253211617

999   2018-06-26 20:38:07.950590072

Name: time, Length: 1000, dtype: datetime64[ns]

第二步:将新的time列设置成索引。

# 设置 time 一列为 df_log 的索引

df_log.set_index("time", inplace=True)

# 查看最新的 DataFrame

df_log

执行后输出:

从图中可以看到,时间列已代替了之前的序号,成为了DataFrame的索引。

(3)根据时间筛选数据

以上步骤做完之后,我们就可以通过时间来筛选DataFrame中的数据了。

①查询9月1日至9月15日的数据

df_log.loc["2018-09-01" : "2018-09-15",:]

②选择从 8月到9月的数据

df_log.loc["2018-08" : "2018-09", :]

③选择从 8 月 1 日到 9 月 2 日下午两点之前的数据

df_log.loc["2018-08-01" : "2018-09-02 14:00:00", :]

执行上述代码后,我们就可以看到根据时间筛选的DataFrame对应的数据了。

欢迎关注公众号:服务端技术精选

如果有疑问或者是其他需求,可公众号留言

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1425159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vit细粒度图像分类(六)TransFC学习笔记

1.摘要 从判别局部区域学习特征表示在细粒度视觉分类中起着关键作用。利用注意机制提取零件特征已成为一种趋势。然而,这些方法有两个主要的局限性:第一,它们往往只关注最突出的部分,而忽略了其他不明显但可区分的部分。其次,他们…

2024不可不会的StableDiffusion之拼接各组件(五)

1. 引言 在之前的文章中,我介绍了如何安装扩散器库diffuser用以生成 AI 图像和构成stable diffusion的各个关键组件,即 CLIP 文本编码器、VAE 和 U-Net。在这篇文章中,我们将尝试把这些关键组件放在一起,并详细展示生成图像的扩散…

如何在Shopee菲律宾市场进行选品:策略和建议

在Shopee菲律宾市场进行选品时,卖家需要采取一系列策略和建议,以确保他们的产品能够在这个市场上取得成功。这篇文章将介绍一些关键的策略和建议,帮助卖家更好地了解市场趋势、关注热销品类、满足消费者需求、创新营销手段、优化供应链管理、…

大数据分析|从七个特征理解大数据分析

文献来源:Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接:链接:https://pan.baidu.com/s/1…

如何进行有效的Shopee新店选品

在Shopee平台上开设新店是一个令人兴奋的时刻,但是在开始销售之前,进行有效的选品是至关重要的一步。选品的质量和策略将直接影响你的市场竞争力和销售业绩。下面是一些建议,可以帮助你进行有效的Shopee新店选品。 先给大家推荐一款shopee知虾…

❤ 做一个自己的AI智能机器人吧

❤ 做一个自己的AI智能机器人 看了扣子(coze)的模型,字节基于chatgpt搭建的一个辅助生成AI的网站,感觉蛮有意思,看了掘金以后,于是动手自己也实现了一个。 官网 https://www.coze.cn/ 进入的网站 1、 创…

算法模板 1.前缀和

前缀和&#xff1a;以O(1)的时间求解一段区间的和&#xff0c;空间复杂度O(n) 一维前缀和 795. 前缀和 - AcWing题库 #include <bits/stdc.h> using namespace std; const int N 100010; int a[N],s[N]; int main(){int n,m;scanf("%d%d",&n,&m);fo…

跟着cherno手搓游戏引擎【15】DrawCall的封装

目标&#xff1a; Application.cpp:把渲染循环里的glad代码封装成自己的类&#xff1a; #include"ytpch.h" #include "Application.h"#include"Log.h" #include "YOTO/Renderer/Renderer.h" #include"Input.h"namespace YO…

个人建站前端篇(二)项目采用服务端渲染SSR

SSR的优点 更好的SEO首屏加载速度更快&#xff0c;用户体验更好可以使用相同的语言以及相同的声明式、面向组件的心智模型来开发整个应用&#xff0c;而不需要在后端模板系统和前端框架之间来回切换。 Vue生态中的SSR通用解决方案 Nuxt是一个构建于 Vue 生态系统之上的全栈框…

Modelarts自动学习之旅,实现智慧食堂的人脸识别提示优化

前言 最近公司食堂进行了升级&#xff0c;不但餐盘更换为智能餐盘&#xff0c;且结账的时候可以刷脸支付。 这些升级让排队结账的速度提升了很多&#xff0c;且食堂员工效率也随之提高了很多。果然&#xff0c;科技改变世界。 我观察了一下&#xff0c;智能餐盘基本没有卡顿…

最新2024如何解决谷歌浏览器Chrome谷歌翻译无法使用问题

快速恢复谷歌浏览器一键翻译功能在Chrome 中安装好【翻译】插件 Macbook 操作步骤&#xff1a; 1点击“前往”&#xff0c;打开“前往文件夹” 2 在对话框中输入“/etc” 囝找到“hosts”文件&#xff0c;复制粘贴到桌面 3 在复制的文件最后新起一行&#xff0c;输入并保存&am…

UnityShader(十二)实现标准光照模型中的高光反射

目录 基本光照模型中的高光反射公式&#xff1a; 逐顶点光照 逐像素光照 基本光照模型中的高光反射公式&#xff1a; 从公式可以看出 要计算高光反射需要知道四个参数&#xff1a;入射光线的颜色和强度clight&#xff0c;材质的高光反射系数mspecular&#xff0c;视角方向v以…

怿星科技荣膺星河智联“2023年度卓越供应商”,共创智能座舱新未来

1月19日&#xff0c;在星河智联2023年度卓越供应商评选活动中&#xff0c;怿星科技凭借卓越的产品和优质的服务&#xff0c;以及在项目管理、设计开发和成本控制等多方面的出色表现&#xff0c;荣获了“年度卓越供应商”的荣誉称号。 添加图片注释&#xff0c;不超过 140 字&am…

UML/SysML建模工具更新情况(截至2024年1月)(2)Papyrus 6.6.0

工具最新版本&#xff1a;drawio-desktop 23.0.2 更新时间&#xff1a;2024年1月25日 工具简介 开源绘图工具&#xff0c;用Electron编写&#xff0c;跨平台&#xff0c;支持UML。桌面版和在线版现在版本号已统一。在线版&#xff1a;Flowchart Maker & Online Diagram S…

oracle数据库慢查询SQL

目录 场景&#xff1a; 环境&#xff1a; 慢SQL查询一&#xff1a; 问题一&#xff1a;办件列表查询慢 分析&#xff1a; 解决方法&#xff1a; 问题二&#xff1a;系统性卡顿 分析&#xff1a; 解决方法&#xff1a; 慢SQL查询二 扩展&#xff1a; 场景&#xff1a; 线…

Uniapp登录页面获取头像、昵称的最新方法的简单使用

前言 写小程序写到登录页面的时候&#xff0c;发现官方文档中原来的wx.getUserInfo和wx.getUserProfile不太能用了&#xff0c;学习了相对比较新的方法&#xff0c;这种方法的文档链接如下&#xff1a; https://developers.weixin.qq.com/miniprogram/dev/framework/open-abil…

免费的ChatGPT网站 ( 7个 )

ChatGPT的核心功能是基于用户在输入时的语言或文本生成相应的回复或继续内容。此外&#xff0c;它还能够完成多种任务&#xff0c;如撰写邮件、视频脚本、文案、翻译、代码编写以及撰写论文等。 博主归纳总结了7个国内非常好用&#xff0c;而且免费的chatGPT网站&#xff0c;AI…

Camunda ScriptTask SendTask ReceiveTask操作

文章目录 开始脚本任务(ScriptTask)发送任务(SendTask)接收任务(ReceiveTask)流程图xml 开始 前面我们已经介绍了Camunda最基本的操作和常见的监听器&#xff0c;如果不熟悉Camunda&#xff0c;可以先看一下&#xff0c;方便搭建环境&#xff0c;亲手测试。 Camunda组件与服务…

轻量式RPC调用日志链路设计方案

导语: 调用链跟踪系统,又称为tracing&#xff0c;是微服务设计架构中&#xff0c;从系统层面对整体的monitoring和profiling的一种技术手 背景说明 由于我们的项目是微服务方向&#xff0c;中后台服务调用链路过深&#xff0c;追踪路径过长&#xff0c;其中某个服务报错或者异…

YOLOv5改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv5检测器

💡本篇内容:YOLOv5改进芒果首发:24年最新论文Shift-ConvNets:稀疏/移位操作让小卷积核也能达到大卷积核效果,来打造新颖YOLOv5检测器 💡附改进源代码及教程,用来改进作为 🚀改进Shift-ConvNets 深圳大学出品!!24年最新论文 Shift-ConvNets地址:https://arxiv.o…