我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Pandas 实现MySQL日期函数的解决方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Pandas 实现MySQL日期函数的解决方法

一、前言

环境:
windows11 64位
Python3.9
MySQL8
pandas1.4.2

本文主要介绍 MySQL 中的日期函数date_add()/date_sub()date_format()year()/month()/day()/hour()/minute()/second()datediff()datepart()from_unixtime()unix_timestamp()如何使用pandas实现,同时二者又有什么区别。

注:Python是很灵活的语言,达成同一个目标或有多种途径,我提供的只是其中一种解决方法,大家有其他的方法也欢迎留言讨论。

二、语法对比

数据表

本次使用的数据如下。
使用 Python 构建该数据集的语法如下:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({ 'col1' : list(range(1,7))
                    ,'col2' : ['AA','AA','AA','BB','AA','BB']#list('AABCA')
                    ,'col3' : ['2022-01-01','2022-01-01','2022-01-02','2022-01-02','2022-01-03','2022-01-03']
                    ,'col4' : ['2022-02-01','2022-01-21','2022-01-23','2022-01-12','2022-02-03','2022-01-05']
                    ,'col5' : [1643673600,1642723200,1642896000,1641945600,1643846400,1641340800]
                   })
df1['col3'] = pd.to_datetime(df1.col3)
df1['col4'] = pd.to_datetime(df1.col4)
df1

注:直接将代码放 jupyter 的 cell 跑即可。后文都直接使用df1调用对应的数据。

使用 MySQL 构建该数据集的语法如下:

with t1 as(
  select  1 as col1, 'AA' as col2, '2022-01-01' as col3, '2022-02-01' as col4, 1643673600 as col5 union all
  select  2 as col1, 'AA' as col2, '2022-01-01' as col3, '2022-01-21' as col4, 1642723200 as col5 union all
  select  3 as col1, 'AA' as col2, '2022-01-02' as col3, '2022-01-23' as col4, 1642896000 as col5 union all
  select  4 as col1, 'BB' as col2, '2022-01-02' as col3, '2022-01-12' as col4, 1641945600 as col5 union all
  select  5 as col1, 'AA' as col2, '2022-01-03' as col3, '2022-02-03' as col4, 1643846400 as col5 union all
  select  6 as col1, 'BB' as col2, '2022-01-03' as col3, '2022-01-05' as col4, 1641340800 as col5 
)
select * from t1;

注:直接将代码放 MySQL 代码运行框跑即可。后文跑 SQL 代码时,默认带上数据集(代码的1~8行),仅展示查询语句,如第9行。

对应关系如下:

Python 数据集MySQL 数据集
df1t1

date_add()/date_sub()

时间的加减,在 MySQL 中,使用的是date_add()/date_sub()来实现,二者可以替换使用,只要对相加/减的时间加上负号即可(详见后面例子)。
而在 Pandas 中,可以通过Timedelta()DateOffset()实现,二者有差异,如果是针对月份和年度计算差值,只能使用后者;如果是计算日、时、分、秒,则二者通用。
时间范围对应的语法参数见下表:

时间范围date_add()/date_sub()pandas.Timedelta()pandas.DateOffset()
year-years
month-months
daydaysdays
hourhourshours
minuteminutesminutes
secondsecondsseconds

1、增加1天

MySQL 增加 1 天,可以使用date_add()+1 day或者用date_sub()-1 day
Pandas 中,可以使用 DateFrame 时间列直接加上pd.Timedelta(days=1)或者pd.DateOffset(days=1)

语言PythonMySQL
代码【Python1】
df1.col3 + pd.Timedelta(days=1)
【Python2】
df1.col3 + pd.DateOffset(days=1)
【MySQL1】
select date_add(t1.col3,interval 1 day) as col3_1 from t1;
【MySQL2】
select date_sub(t1.col3,interval -1 day) as col3_1 from t1;
结果

2、减掉1天

语言PythonMySQL
代码【Python1】
df1.col3 + pd.Timedelta(days=-1)
【Python2】
df1.col3 + pd.DateOffset(days=-1)
【MySQL1】
select date_add(t1.col3,interval -1 day) as col3_1 from t1;
【MySQL2】
select date_sub(t1.col3,interval 1 day) as col3_1 from t1;
结果

datediff()

计算时间的差值,在 MySQL 中,使用datediff(<被减数>,<减数>)(即<被减数>-<减数>)实现;而在 Pandas 中,操作相对简单,两个 Series 相减即可。但是相减之后的数据类型是timedelta64[ns],如果要用于比较大小,或需要转化为整数,将timedelta64[ns]的数值提取出来,提取数值可以使用其属性days并借助apply()实现,具体代码逻辑见以下例子。

语言PythonMySQL
代码(df1.col4-df1.col3).apply(lambda x:x.days)select datediff(col4,col3) as diff from t1;
结果

date_format()

格式设置,在 MySQL 中,使用date_format(),在 Python 中,使用strftime(),二者都是将时间类型转化为字符串类型。标识符有一点差异,前者的分使用%i,秒使用%s,而后者分使用%M,秒使用%S
具体格式参考下表:

时间范围(示例)date_format()strftime()
年,0000~9999%Y%Y
月,01~12%m%m
日,01~31%d%d
时,00~24%H%H
分,00~59%i%M
秒,00~59%s%S

格式化为:年份-月份
MySQL 直接使用date_format(列,"<格式符号>")函数套用即可;而 Python 中,由于strftime('<格式符号>')是作用于时间类型,而df1.col3是 Series 类型,所以需要使用apply()来辅助处理每一个值(如下 Python 代码)。

语言PythonMySQL
代码df1.col3.apply(lambda x:x.strftime(‘%Y-%m’))select date_format(t1.col3,‘%Y-%m’) as col3_1 from t1;
结果

year()/month()/day()/hour()/minute()/second()

取时间的某一部分(如:年、月、日、时、分、秒),在 MySQL 中,直接使用对应的函数作用于字段即可。
在 Python 中,时间类型的值也有对应的属性可以获取到对应的值,同样地,由于df1.col3是 Series 类型,所以需要使用apply()来辅助处理每一个值(如下 Python 代码)。

语言PythonMySQL
代码df_timepart = pd.concat([
df1.col4.apply(lambda x:x.year)
,df1.col4.apply(lambda x:x.month)
,df1.col4.apply(lambda x:x.day)
,df1.col4.apply(lambda x:x.hour)
,df1.col4.apply(lambda x:x.minute)
,df1.col4.apply(lambda x:x.second)
],axis=1
)
df_timepart.columns=[‘year’,‘month’,‘day’,‘hour’,‘minute’,‘second’]
df_timepart
select year(col4),month(col4),day(col4),hour(col4),minute(col4),second(col4) from t1;
结果

from_unixtime()/unix_timestamp()

使用时间戳时,需要特别注意:pandas 采用的是 零时区的时间,MySQL 会默认当地时间,北京时间采用的是东八区,所以北京的时间会比零时区早8小时,也就是说,同一个时间戳,北京时间会比零时区时间多8小时,如:1577836800,转化为北京时间是【2020-01-01 08:00:00】,转化为零时区时间为【2020-01-01 00:00:00】。

1、时间戳转时间
时间戳转时间,在 MySQL 中,通过from_unixtime()函数直接作用于列即可,还可以指定时间格式,格式化字符参考date_format()中的表格。
在 Pandas 中,通过to_datetime()实现,注意需要指定unit,它根据时间戳的精度设置,常见参数有:【D,s,ms】,分别对应日数、秒数、毫秒数(相对1970-01-01 00:00:00的间隔数)。
注意:如果需要转化为东八区,只能通过手动添加 8 小时。

语言PythonMySQL
代码【Python 1 默认时区】
pd.to_datetime(df1.col5, unit=‘s’)
【Python 2 东八时区】
pd.to_datetime(df1.col5, unit=‘s’)+pd.Timedelta(hours=8)
select from_unixtime(col5) from t1;
结果

2、时间转时间戳
时间转时间戳,在 MySQL 中,通过unix_timestamp()函数直接作用于列即可。
在 Pandas 中,通过apply()+timestamp()实现,如果需要转化为东八区,先对时间做一层tz_localize("Asia/Shanghai")处理,然后再转化即可,返回的是浮点数。
注意:这里有一个小细节,由于返回的值默认是科学计数方式,而我需要查看完整数字串,而且没有小数值,我加了int()处理。如果使用的时间精确到毫秒,即存在小数,加int()处理会丢失精度,应用时需要结合自己的实际情况和需求做处理。

语言PythonMySQL
代码【Python 1 默认时区】
df1.col4.apply(lambda x:int(x.timestamp()))
【Python 2 东八时区】
df1.col4.apply(lambda x:int(x.tz_localize(“Asia/Shanghai”).timestamp()))
select unix_timestamp(col4) from t1;
结果

三、小结

1、一个时间自定义加减使用Timedelta()DateOffset()
2、两个时间取差值直接相加减;
3、格式化使用strftime()
4、取时间的指定部分,使用对应的属性 yearmonthdayhourminutesecond
5、时间戳和时间的转化:to_datetime()timestamp()

到此这篇关于用Pandas 实现MySQL日期函数的效果的文章就介绍到这了,更多相关Pandas日期函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Pandas 实现MySQL日期函数的解决方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Pandas 实现MySQL日期函数的解决方法

这篇文章主要介绍了用Pandas 实现MySQL日期函数的效果,Python是很灵活的语言,达成同一个目标或有多种途径,我提供的只是其中一种解决方法,需要的朋友可以参考下
2023-02-22

怎么使用Pandas实现MySQL日期函数

本文小编为大家详细介绍“怎么使用Pandas实现MySQL日期函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么使用Pandas实现MySQL日期函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、前言环
2023-07-05

使用Pandas实现MySQL窗口函数的解决方法

本文主要介绍MySQL中的窗口函数row_number()、lead()/lag()、rank()/dense_rank()、first_value()、count()、sum()如何使用pandas实现,同时二者又有什么区别,感兴趣的朋友一起看看吧
2023-02-22

MySQL学习之日期函数的用法详解

目录获取 系统时间 函数日期格式化 函数日期函数练习①日期函数练习②日期计算的注意事项日期偏移计算计算日期之间相隔的天数获取 系统时间 函数“NOW()” 函数 能够获得当前系统日期和时间,格式如下:“
2022-08-12

Javascript日期时间函数的使用方法举例

Javascript提供丰富的日期时间函数,用于操作和转换日期时间值。涵盖获取当前日期时间、设置日期时间、获取日期时间组件、格式化、比较、数学运算等功能。本文提供详细示例,帮助理解和使用这些函数。
Javascript日期时间函数的使用方法举例
2024-04-02

PHP日期函数实现时间相关功能的方法总结

PHP日期函数是PHP语言中的一个重要特性,可以实现各种时间相关的功能。在本篇文章中,将总结一些常用的PHP日期函数的用法,帮助读者更好地理解和使用它们。一、获取当前时间PHP日期函数中最常用的一个函数就是date()函数,可以获取当前的日
PHP日期函数实现时间相关功能的方法总结
2023-11-20

MySQL中substr函数使用方法实例详解

目录前言1. SUBSTR 函数简介2. SUBSTR 函数的基本语法3. SUBSTR 函数的使用示例3.1 提取子字符串3.2 从特定位置开始提取3.3 提取特定长度的子字符串3.4 在实际应用中的示例示例 1:从电子邮件地址中提取域名
MySQL中substr函数使用方法实例详解
2024-08-09

详解 MySQL中count函数的正确使用方法

1. 描述 在MySQL中,当我们需要获取某张表中的总行数时,一般会选择使用下面的语句select count(*) from table;其实count函数中除了*还可以放其他参数,比如常数、主键id、字段,那么它们有什么区别?各自效率如
2022-05-17

实例讲解Vue中customRef函数的使用方法

Vue中如何使用customRef函数?下面本篇文章就来带大家了解一下VueJs中customRef函数的使用方法,希望对大家有所帮助!
2023-05-14

mysql now()函数调用系统时间不对的解决方法

目录向数据库写记录最好用不用客户端时间mysql服务器时区不等于东八区的问题MySQL时区的设置和docker有关今天在MySQL的Now函数上踩了两个坑,花了不少时间。向数据库写记录最好用不用客户端时间第一js个坑是客户端、服务器的系
2023-05-25

通过使用Ajax函数实现异步数据交换的方法

如何利用Ajax函数实现异步数据交互随着互联网和Web技术的发展,前端与后端之间的数据交互变得十分重要。传统的数据交互方式,如页面刷新和表单提交,已经不能满足用户的需求。而Ajax(Asynchronous JavaScript and
通过使用Ajax函数实现异步数据交换的方法
2024-01-26

编程热搜

目录