亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

使用Pandas?實現(xiàn)MySQL日期函數(shù)的解決方法

 更新時間:2023年02月22日 10:09:15   作者:Xin學數(shù)據(jù)  
這篇文章主要介紹了用Pandas?實現(xiàn)MySQL日期函數(shù)的效果,Python是很靈活的語言,達成同一個目標或有多種途徑,我提供的只是其中一種解決方法,需要的朋友可以參考下

一、前言

環(huán)境:
windows11 64位
Python3.9
MySQL8
pandas1.4.2

本文主要介紹 MySQL 中的日期函數(shù)date_add()/date_sub()date_format()、year()/month()/day()/hour()/minute()/second()datediff()、datepart()、from_unixtime()、unix_timestamp()如何使用pandas實現(xiàn),同時二者又有什么區(qū)別。

注:Python是很靈活的語言,達成同一個目標或有多種途徑,我提供的只是其中一種解決方法,大家有其他的方法也歡迎留言討論。

二、語法對比

數(shù)據(jù)表

本次使用的數(shù)據(jù)如下。
使用 Python 構建該數(shù)據(jù)集的語法如下:

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調(diào)用對應的數(shù)據(jù)。

使用 MySQL 構建該數(shù)據(jù)集的語法如下:

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 代碼時,默認帶上數(shù)據(jù)集(代碼的1~8行),僅展示查詢語句,如第9行。

對應關系如下:

Python 數(shù)據(jù)集MySQL 數(shù)據(jù)集
df1t1

date_add()/date_sub()

時間的加減,在 MySQL 中,使用的是date_add()/date_sub()來實現(xiàn),二者可以替換使用,只要對相加/減的時間加上負號即可(詳見后面例子)。
而在 Pandas 中,可以通過Timedelta()DateOffset()實現(xiàn),二者有差異,如果是針對月份和年度計算差值,只能使用后者;如果是計算日、時、分、秒,則二者通用。
時間范圍對應的語法參數(shù)見下表:

時間范圍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(<被減數(shù)>,<減數(shù)>)(即<被減數(shù)>-<減數(shù)>)實現(xiàn);而在 Pandas 中,操作相對簡單,兩個 Series 相減即可。但是相減之后的數(shù)據(jù)類型是timedelta64[ns],如果要用于比較大小,或需要轉化為整數(shù),將timedelta64[ns]的數(shù)值提取出來,提取數(shù)值可以使用其屬性days并借助apply()實現(xiàn),具體代碼邏輯見以下例子。

語言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(列,"<格式符號>")函數(shù)套用即可;而 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 中,直接使用對應的函數(shù)作用于字段即可。
在 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 采用的是 零時區(qū)的時間,MySQL 會默認當?shù)貢r間,北京時間采用的是東八區(qū),所以北京的時間會比零時區(qū)早8小時,也就是說,同一個時間戳,北京時間會比零時區(qū)時間多8小時,如:1577836800,轉化為北京時間是【2020-01-01 08:00:00】,轉化為零時區(qū)時間為【2020-01-01 00:00:00】。

1、時間戳轉時間
時間戳轉時間,在 MySQL 中,通過from_unixtime()函數(shù)直接作用于列即可,還可以指定時間格式,格式化字符參考date_format()中的表格。
在 Pandas 中,通過to_datetime()實現(xiàn),注意需要指定unit,它根據(jù)時間戳的精度設置,常見參數(shù)有:【D,s,ms】,分別對應日數(shù)、秒數(shù)、毫秒數(shù)(相對1970-01-01 00:00:00的間隔數(shù))。
注意:如果需要轉化為東八區(qū),只能通過手動添加 8 小時。

語言PythonMySQL
代碼【Python 1 默認時區(qū)】
pd.to_datetime(df1.col5, unit=‘s’)
【Python 2 東八時區(qū)】
pd.to_datetime(df1.col5, unit=‘s’)+pd.Timedelta(hours=8)
select from_unixtime(col5) from t1;
結果

2、時間轉時間戳
時間轉時間戳,在 MySQL 中,通過unix_timestamp()函數(shù)直接作用于列即可。
在 Pandas 中,通過apply()+timestamp()實現(xiàn),如果需要轉化為東八區(qū),先對時間做一層tz_localize("Asia/Shanghai")處理,然后再轉化即可,返回的是浮點數(shù)。
注意:這里有一個小細節(jié),由于返回的值默認是科學計數(shù)方式,而我需要查看完整數(shù)字串,而且沒有小數(shù)值,我加了int()處理。如果使用的時間精確到毫秒,即存在小數(shù),加int()處理會丟失精度,應用時需要結合自己的實際情況和需求做處理。

語言PythonMySQL
代碼【Python 1 默認時區(qū)】
df1.col4.apply(lambda x:int(x.timestamp()))
【Python 2 東八時區(qū)】
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、取時間的指定部分,使用對應的屬性 year、month、day、hour、minute、second
5、時間戳和時間的轉化:to_datetime()、timestamp()

到此這篇關于用Pandas 實現(xiàn)MySQL日期函數(shù)的效果的文章就介紹到這了,更多相關Pandas日期函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python數(shù)組中的?k-diff?數(shù)對例題解析

    python數(shù)組中的?k-diff?數(shù)對例題解析

    這篇文章主要介紹了python數(shù)組中的?k-diff?數(shù)對例題解析,文章根據(jù)題目內(nèi)容對其進行分析以此展開主題內(nèi)容,感興趣的小伙伴可以參考一下下面文章詳情
    2022-06-06
  • Python實現(xiàn)多行注釋的另類方法

    Python實現(xiàn)多行注釋的另類方法

    這篇文章主要介紹了Python實現(xiàn)多行注釋的另類方法,本文使用的是Python多行文本功能來另類的實現(xiàn)Python的多行注釋,需要的朋友可以參考下
    2014-08-08
  • Python代碼覆蓋率統(tǒng)計工具coverage.py用法詳解

    Python代碼覆蓋率統(tǒng)計工具coverage.py用法詳解

    這篇文章主要介紹了Python代碼覆蓋率統(tǒng)計工具coverage.py用法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-11-11
  • python中__set_name__的具體使用

    python中__set_name__的具體使用

    在Python中,我們可以通過__set_name__方法來實現(xiàn)一些特殊的操作,本文主要介紹如何在Python中實現(xiàn)__set_name__方法,并且給出一些實際應用的示例,感興趣的可以了解一下
    2024-01-01
  • 使用Python的Twisted框架構建非阻塞下載程序的實例教程

    使用Python的Twisted框架構建非阻塞下載程序的實例教程

    Twisted的異步工作模式使其在非阻塞情況下可以擁有較高的性能,這里我們來看一下使用Python的Twisted框架構建非阻塞下載程序的實例教程,包括服務器端與客戶端的實踐.
    2016-05-05
  • Python sqlparse 解析庫的基礎使用過程解析

    Python sqlparse 解析庫的基礎使用過程解析

    sqlparse 是一個 Python 庫,是一個用于 Python 的非驗證 SQL 解析器, 用于解析 SQL 語句并提供一個簡單的 API 來訪問解析后的 SQL 結構,這篇文章主要介紹了Python sqlparse 解析庫的基礎使用,需要的朋友可以參考下
    2024-08-08
  • python密碼學RSA算法及秘鑰創(chuàng)建教程

    python密碼學RSA算法及秘鑰創(chuàng)建教程

    這篇文章主要為大家介紹了python密碼學RSA算法及秘鑰創(chuàng)建教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • Python如何輸出異常信息(行號)

    Python如何輸出異常信息(行號)

    這篇文章主要介紹了Python如何輸出異常信息(行號)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python通過調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)功能示例

    Python通過調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)功能示例

    這篇文章主要介紹了Python通過調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)功能,結合實例形式分析了Python調(diào)用mysql存儲過程實現(xiàn)更新數(shù)據(jù)的具體步驟與相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • 利用python繪制數(shù)據(jù)曲線圖的實現(xiàn)

    利用python繪制數(shù)據(jù)曲線圖的實現(xiàn)

    這篇文章主要介紹了利用python繪制數(shù)據(jù)曲線圖的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04

最新評論