Pandas數(shù)據(jù)分析固定時(shí)間點(diǎn)和時(shí)間差
前言
pandas處理時(shí)間的對(duì)象有很多,分別表示不同的作用。
本次介紹固定時(shí)間對(duì)象和時(shí)間長(zhǎng)對(duì)象。
還是先導(dǎo)入包:
import numpy as np import pandas as pd import datetime
固定時(shí)間 時(shí)間點(diǎn)對(duì)象的建立
時(shí)間點(diǎn)就表示一個(gè)時(shí)刻的具體時(shí)間,比如現(xiàn)在是2022年8月10日16:31:56。
時(shí)間對(duì)象的建立有很多方法。
#使用 python 的 datetime 庫(kù),至少需要年月日
datetime.datetime.now()
#指定時(shí)間 datetime.datetime(2022,8,10,10,5)
#pandas 等第三方庫(kù)都是在datetime建立時(shí)間對(duì)象的 #pd.Timestamp() 是定義時(shí)間的主要函數(shù),代替 python 中的 datetime.datetime 對(duì)象。 pd.Timestamp(datetime.datetime(2020, 6, 8))
指定時(shí)間字符串
pd.Timestamp('2012-05-01') # Timestamp('2012-05-01 00:00:00') pd.Timestamp('2017-01-01T12') # Timestamp('2017-01-01 12:00:00')
#指定時(shí)間位置數(shù)字,可以依次定義 year, month, day,hour, minute, second, microsecond
pd.Timestamp(2012, 5, 1) # Timestamp('2012-05-01 00:00:00') pd.Timestamp(2017, 1, 1, 12) # Timestamp('2017-01-01 12:00:00') pd.Timestamp(year=2017, month=1, day=1, hour=12) # Timestamp('2017-01-01 12:00:00')
#解析時(shí)間戳 pd.Timestamp(1513393355.5, unit='s') # 單位為秒 # Timestamp('2017-12-16 03:02:35.500000') #指定時(shí)區(qū) pd.Timestamp(1513393355, unit='s', tz='US/Pacific') # Timestamp('2017-12-15 19:02:35-0800', tz='US/Pacific') # 指定為北京時(shí)間 pd.Timestamp(1513393355, unit='s', tz='Asia/Shanghai') # Timestamp('2017-12-16 11:02:35+0800', tz='Asia/Shanghai') #特殊時(shí)間 #以下可取得當(dāng)前時(shí)間,從而可通過(guò)屬性取到今天日期、年份等信息: pd.Timestamp('today') pd.Timestamp('now') # Timestamp('2022-08-10 10:11:56.532981') pd.Timestamp('today').date() # 只取日期
#也可以計(jì)算出昨天、明天等信息: # 昨天 pd.Timestamp('now')-pd.Timedelta(days=1) # Timestamp('2020-06-08 16:14:39.254365') # 明天 pd.Timestamp('now')+pd.Timedelta(days=1) # Timestamp('2020-06-10 16:15:28.019039') # 當(dāng)月初,一日 pd.Timestamp('now').replace(day=1) # Timestamp('2020-06-01 16:15:28.019039') #時(shí)間限制 #由于 Pandas 以納秒粒度表示時(shí)間戳,因此可以使用64位整數(shù)表示的時(shí)間跨度限制為大約584年: pd.Timestamp.min # Timestamp('1677-09-21 00:12:43.145225') pd.Timestamp.max # Timestamp('2262-04-11 23:47:16.854775807')
時(shí)間屬性
一個(gè)具體的時(shí)間包含了非常豐富的信息,如年份、在周幾、在幾月、在哪個(gè)季度,需要我們進(jìn)行屬性的讀取。
#先創(chuàng)建一個(gè)時(shí)間 time = pd.Timestamp('now') time
以下是豐富的時(shí)間屬性:
time.asm8 # 返回 numpy datetime64格式(以納秒為單位)。 #numpy.datetime64('2022-08-10T09:58:52.365676000') time.dayofweek # 1 周幾,周一為0 time.day_of_week # 同上 time.dayofyear # 161, 一年的第幾天 time.day_of_year # 同上 time.days_in_month # 30 當(dāng)月有多少天 time.daysinmonth # 30 同上 time.freqstr # None, 周期字符 time.is_leap_year # True 是否閏年,公歷的 time.is_month_end # False 是否當(dāng)月最后一天 time.is_month_start # False 是否當(dāng)月第一天 time.is_quarter_end # False 是否當(dāng)季最后一天 time.is_quarter_start # False 是否當(dāng)季第一天 time.is_year_end # 是否當(dāng)年最后一天 time.is_year_start # 是否當(dāng)年第一天 time.quarter # 2 當(dāng)前季度數(shù) # 如指定會(huì)返回類似 <DstTzInfo 'Asia/Shanghai' CST+8:00:00 STD> time.tz # None 當(dāng)前時(shí)區(qū)別名 time.week # 24 當(dāng)年第幾周 time.weekofyear # 24 同上 time.day # 9 日 time.fold # 0 time.freq # None 頻度周期 time.hour # 16 time.microsecond # 890462 time.minute # 46 time.month # 6 time.nanosecond # 0 time.second # 59 time.tzinfo # None time.value # 1591721219890462000 time.year # 2020
時(shí)間方法
time = pd.Timestamp('now', tz='Asia/Shanghai') # Timestamp('2020-06-09 16:55:58.027896+0800', tz='Asia/Shanghai') #方法如下: # 轉(zhuǎn)換為指定時(shí)區(qū) time.astimezone('UTC') # Timestamp('2020-06-09 08:55:58.027896+0000', tz='UTC') # 轉(zhuǎn)換單位,向上舍入 time.ceil('s') # 轉(zhuǎn)為以秒為單位 # Timestamp('2020-06-09 16:55:59+0800', tz='Asia/Shanghai') time.ceil('ns') # 轉(zhuǎn)為以納秒為單位 time.ceil('d') # 保留日 time.ceil('h') # 保留時(shí) # 轉(zhuǎn)換單位, 為向下舍入 time.floor('h') # 保留時(shí) # Timestamp('2020-06-09 17:00:00+0800', tz='Asia/Shanghai') # 類似四舍五入 time.round('h') # 保留時(shí)
# 返回星期名 time.day_name() # 'Tuesday' # 月份名稱 time.month_name() # 'June' # 將時(shí)間戳規(guī)范化為午夜,保留tz信息。 time.normalize() # Timestamp('2020-06-09 00:00:00+0800', tz='Asia/Shanghai') # 時(shí)間元素替換 datetime.replace,可處理納秒。 time.replace(year=2019) # 年份換為2019年 # Timestamp('2019-06-09 17:14:44.126817+0800', tz='Asia/Shanghai') time.replace(month=8) # 月份換為8月 # Timestamp('2020-08-09 17:14:44.126817+0800', tz='Asia/Shanghai') # 轉(zhuǎn)為周期類型,將丟失時(shí)區(qū) time.to_period(freq='h') # 周期為小時(shí) # Period('2020-06-09 17:00', 'H') # 轉(zhuǎn)為指定時(shí)區(qū) time.tz_convert('UTC') # 轉(zhuǎn)為 utc 時(shí)間 # Timestamp('2020-06-09 09:14:44.126817+0000', tz='UTC') # 本地化時(shí)區(qū)轉(zhuǎn)換 time = pd.Timestamp('now') time.tz_localize('Asia/Shanghai') # Timestamp('2020-06-09 17:32:47.388726+0800', tz='Asia/Shanghai') time.tz_localize(None) # 刪除時(shí)區(qū)
時(shí)間缺失值
pd.Timestamp(pd.NaT) #參與計(jì)算 pd.NaT+pd.Timestamp('20201001')
.dt 時(shí)間訪問(wèn)器
#對(duì)于時(shí)間序列數(shù)據(jù),可以使用 s.dt.xxx 的形式來(lái)訪問(wèn)它們的屬性和調(diào)用它們的方法:
s = pd.Series(pd.date_range('2020-01-01', periods=3, freq='d')) s.dt.date s.dt.time s.dt.timetz s.dt.year s.dt.month s.dt.day s.dt.hour s.dt.minute s.dt.second s.dt.microsecond s.dt.nanosecond s.dt.week s.dt.weekofyear s.dt.dayofweek s.dt.weekday s.dt.dayofyear s.dt.quarter s.dt.is_month_start s.dt.is_month_end s.dt.is_quarter_start s.dt.is_quarter_end s.dt.is_year_start s.dt.is_year_end s.dt.is_leap_year s.dt.daysinmonth s.dt.days_in_month s.dt.tz s.dt.freq s.dt.to_period s.dt.to_pydatetime s.dt.tz_localize s.dt.tz_convert s.dt.normalize s.dt.strftime s.dt.round s.dt.floor s.dt.ceil s.dt.month_name s.dt.day_name s.dt.qyear s.dt.start_time s.dt.end_time s.dt.days s.dt.seconds s.dt.microseconds s.dt.nanoseconds s.dt.components s.dt.to_pytimedelta s.dt.total_seconds # 個(gè)別用法舉例 s.dt.tz_localize('UTC').dt.tz_convert('US/Eastern') s.dt.strftime('%Y/%m/%d')
時(shí)長(zhǎng)數(shù)據(jù)
時(shí)間差
和上面的時(shí)間點(diǎn)比起來(lái),時(shí)間差就表示一個(gè)時(shí)間的長(zhǎng)度,一天一小時(shí)這種時(shí)間差。
Timedelta 數(shù)據(jù)類型用來(lái)代表時(shí)間增量,兩個(gè)固定時(shí)間相減會(huì)產(chǎn)生時(shí)差:
# 兩個(gè)固定時(shí)間相減 pd.Timestamp('2020-11-01 15') - pd.Timestamp('2020-11-01 14') # Timedelta('0 days 01:00:00') pd.Timestamp('2020-11-01 08') - pd.Timestamp('2020-11-02 08') # Timedelta('-1 days +00:00:00')
按以下格式傳入字符串:
# 一天 pd.Timedelta('1 days') # Timedelta('1 days 00:00:00') pd.Timedelta('1 days 00:00:00') # Timedelta('1 days 00:00:00') pd.Timedelta('1 days 2 hours') # Timedelta('1 days 02:00:00') pd.Timedelta('-1 days 2 min 3us') # Timedelta('-2 days +23:57:59.999997'
用關(guān)鍵字參數(shù)指定時(shí)間: pd.Timedelta(days=5, seconds=10) # Timedelta('5 days 00:00:10') pd.Timedelta(minutes=3, seconds=2) # Timedelta('0 days 00:03:02') # 可以實(shí)現(xiàn)指定分鐘有多少天,多少小時(shí) pd.Timedelta(minutes=3242)
使用帶周期量的偏移量別名:
# 一天 pd.Timedelta('1D') # Timedelta('1 days 00:00:00') # 兩周 pd.Timedelta('2W') # Timedelta('14 days 00:00:00') # 一天2小時(shí)3分鐘4秒 pd.Timedelta('1D2H3M4S')
帶單位的整型數(shù)字:
# 一天 pd.Timedelta(1, unit='d') # 100 秒 pd.Timedelta(100, unit='s') # Timedelta('0 days 00:01:40') # 4 周 pd.Timedelta(4, unit='w') # Timedelta('28 days 00:00:00')
Python內(nèi)置的datetime.timedelta或者Numpy的np.timedelta64:
# 一天10分鐘 pd.Timedelta(datetime.timedelta(days=1, minutes=10)) # Timedelta('1 days 00:10:00') # 100納秒 pd.Timedelta(np.timedelta64(100, 'ns')) # Timedelta('0 days 00:00:00.000000100')
負(fù)值
# 負(fù)值 pd.Timedelta('-1min') # Timedelta('-1 days +23:59:00') # 空值,缺失值 pd.Timedelta('nan') # NaT # pd.Timedelta('nat') # NaT
也可以用 DateOffsets (Day, Hour, Minute, Second, Milli, Micro, Nano) 來(lái)構(gòu)建:
pd.Timedelta(pd.offsets.Second(2)) # Timedelta('0 days 00:00:02') #to_timedelta,可以直接生成單個(gè)時(shí)長(zhǎng)數(shù)據(jù): pd.to_timedelta('1 days 06:05:01.00003') # Timedelta('1 days 06:05:01.000030') pd.to_timedelta('15.5us') # Timedelta('0 days 00:00:00.000015') pd.to_timedelta(pd.offsets.Day(3)) # Timedelta('3 days 00:00:00') pd.to_timedelta('15.5min') # Timedelta('0 days 00:15:30') pd.to_timedelta(124524564574835) # Timedelta('1 days 10:35:24.564574835')
時(shí)長(zhǎng)可以相加:
pd.Timedelta(pd.offsets.Day(2)) + pd.Timedelta(pd.offsets.Second(2)) + pd.Timedelta('00:00:00.000123') # Timedelta('2 days 00:00:02.000123')
以下是一些操作示例:
s = pd.Series(pd.date_range('2012-1-1', periods=3, freq='D')) td = pd.Series([pd.Timedelta(days=i) for i in range(3)]) df = pd.DataFrame({'A': s, 'B': td}) df
df['C'] = df['A'] + df['B'] df
df.dtypes
時(shí)長(zhǎng)屬性
tdt=pd.Timedelta('10 days 9 min 3 sec') tdt.days tdt.seconds tdt.value #(時(shí)間戳)
到此這篇關(guān)于Pandas數(shù)據(jù)分析固定時(shí)間點(diǎn)和時(shí)間差的文章就介紹到這了,更多相關(guān)Pandas固定時(shí)間點(diǎn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python實(shí)踐之使用Pandas進(jìn)行數(shù)據(jù)分析
- Pandas常用的數(shù)據(jù)結(jié)構(gòu)和常用的數(shù)據(jù)分析技術(shù)
- Pandas數(shù)據(jù)分析常用函數(shù)的使用
- Pandas數(shù)據(jù)分析-pandas數(shù)據(jù)框的多層索引
- Pandas數(shù)據(jù)分析之pandas數(shù)據(jù)透視表和交叉表
- Pandas數(shù)據(jù)分析之pandas文本處理
- Pandas在數(shù)據(jù)分析和機(jī)器學(xué)習(xí)中的應(yīng)用及優(yōu)勢(shì)
相關(guān)文章
Python參數(shù)傳遞實(shí)現(xiàn)過(guò)程及原理詳解
這篇文章主要介紹了Python參數(shù)傳遞實(shí)現(xiàn)過(guò)程及原理詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05python在windows調(diào)用svn-pysvn的實(shí)現(xiàn)
本文主要介紹了python在windows調(diào)用svn-pysvn的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02Python 實(shí)現(xiàn)在文件中的每一行添加一個(gè)逗號(hào)
下面小編就為大家分享一篇Python 實(shí)現(xiàn)在文件中的每一行添加一個(gè)逗號(hào),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04Python簡(jiǎn)單生成隨機(jī)數(shù)的方法示例
這篇文章主要介紹了Python簡(jiǎn)單生成隨機(jī)數(shù)的方法,結(jié)合實(shí)例形式分析了Python基于random模塊生成隨機(jī)數(shù)的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí)
這篇文章主要介紹了簡(jiǎn)單了解python協(xié)程的相關(guān)知識(shí),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python2.7安裝opencv-python很慢且總是失敗問(wèn)題
這篇文章主要介紹了python2.7安裝opencv-python很慢且總是失敗問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02python實(shí)現(xiàn)跨域代理服務(wù)器的方法
這篇文章主要介紹了python實(shí)現(xiàn)跨域代理服務(wù)器的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07