先簡單的了解下日期和時(shí)間數(shù)據(jù)類型及工具
python標(biāo)準(zhǔn)庫包含于日期(date)和時(shí)間(time)數(shù)據(jù)的數(shù)據(jù)類型,datetime、time以及calendar模塊會被經(jīng)常用到。
datetime以毫秒形式存儲日期和時(shí)間,datetime.timedelta表示兩個(gè)datetime對象之間的時(shí)間差。
給datetime對象加上或減去一個(gè)或多個(gè)timedelta,會產(chǎn)生一個(gè)新的對象
from datetime import datetime
from datetime import timedelta
now = datetime.now()
now
datetime.datetime(2017, 6, 27, 15, 56, 56, 167000)
datetime參數(shù):datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
delta = now - datetime(2017,6,27,10,10,10,10)
delta
datetime.timedelta(0, 20806, 166990)
delta.days
0
delta.seconds
20806
delta.microseconds
166990
只有這三個(gè)參數(shù)了!
datetime模塊中的數(shù)據(jù)類型
類型 |
說明 |
date |
以公歷形式存儲日歷日期(年、月、日) |
time |
將時(shí)間存儲為時(shí)、分、秒、毫秒 |
datetime |
存儲日期和時(shí)間 |
timedelta |
表示兩個(gè)datetime值之間的差(日、秒、毫秒) |
字符串和datetime的相互轉(zhuǎn)換
1)python標(biāo)準(zhǔn)庫函數(shù)
日期轉(zhuǎn)換成字符串:利用str 或strftime
字符串轉(zhuǎn)換成日期:datetime.strptime
stamp = datetime(2017,6,27)
str(stamp)
'2017-06-27 00:00:00'
stamp.strftime('%y-%m-%d')#%Y是4位年,%y是2位年
'17-06-27'
#對多個(gè)時(shí)間進(jìn)行解析成字符串
date = ['2017-6-26','2017-6-27']
datetime2 = [datetime.strptime(x,'%Y-%m-%d') for x in date]
datetime2
[datetime.datetime(2017, 6, 26, 0, 0), datetime.datetime(2017, 6, 27, 0, 0)]
2)第三方庫dateutil.parser的時(shí)間解析函數(shù)
from dateutil.parser import parse
parse('2017-6-27')
datetime.datetime(2017, 6, 27, 0, 0)
parse('27/6/2017',dayfirst =True)
datetime.datetime(2017, 6, 27, 0, 0)
3)pandas處理成組日期
pandas通常用于處理成組日期,不管這些日期是DataFrame的軸索引還是列,to_datetime方法可以解析多種不同的日期表示形式。
date
['2017-6-26', '2017-6-27']
import pandas as pd
pd.to_datetime(date)
DatetimeIndex(['2017-06-26', '2017-06-27'], dtype='datetime64[ns]', freq=None)
datetime 格式定義
代碼 |
說明 |
%Y |
4位數(shù)的年 |
%y |
2位數(shù)的年 |
%m |
2位數(shù)的月[01,12] |
%d |
2位數(shù)的日[01,31] |
%H |
時(shí)(24小時(shí)制)[00,23] |
%l |
時(shí)(12小時(shí)制)[01,12] |
%M |
2位數(shù)的分[00,59] |
%S |
秒[00,61]有閏秒的存在 |
%w |
用整數(shù)表示的星期幾[0(星期天),6] |
%F |
%Y-%m-%d簡寫形式例如,2017-06-27 |
%D |
%m/%d/%y簡寫形式 |
pandas時(shí)間序列基礎(chǔ)以及時(shí)間、日期處理
pandas最基本的時(shí)間序列類型就是以時(shí)間戳(時(shí)間點(diǎn))(通常以python字符串或datetime對象表示)為索引的Series:
dates = ['2017-06-20','2017-06-21', '2017-06-22','2017-06-23','2017-06-24','2017-06-25','2017-06-26','2017-06-27']
import numpy as np
ts = pd.Series(np.random.randn(8),index = pd.to_datetime(dates))
ts
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts.index
DatetimeIndex(['2017-06-20', '2017-06-21', '2017-06-22', '2017-06-23',
'2017-06-24', '2017-06-25', '2017-06-26', '2017-06-27'],
dtype='datetime64[ns]', freq=None)
pandas不同索引的時(shí)間序列之間的算術(shù)運(yùn)算會自動(dòng)按日期對齊
ts[::2]#從前往后每隔兩個(gè)取數(shù)據(jù)
2017-06-20 0.788811
2017-06-22 0.009967
2017-06-24 0.981214
2017-06-26 -0.127258
dtype: float64
ts[::-2]#從后往前逆序每隔兩個(gè)取數(shù)據(jù)
2017-06-27 1.919773
2017-06-25 0.314127
2017-06-23 -1.024626
2017-06-21 0.372555
dtype: float64
ts + ts[::2]#自動(dòng)數(shù)據(jù)對齊
2017-06-20 1.577621
2017-06-21 NaN
2017-06-22 0.019935
2017-06-23 NaN
2017-06-24 1.962429
2017-06-25 NaN
2017-06-26 -0.254516
2017-06-27 NaN
dtype: float64
索引為日期的Series和DataFrame數(shù)據(jù)的索引、選取以及子集構(gòu)造
方法:
1).index[number_int]
2)[一個(gè)可以被解析為日期的字符串]
3)對于,較長的時(shí)間序列,只需傳入‘年’或‘年月’可返回對應(yīng)的數(shù)據(jù)切片
4)通過時(shí)間范圍進(jìn)行切片索引
ts
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts[ts.index[2]]
0.0099673896063391908
ts['2017-06-21']#傳入可以被解析成日期的字符串
0.37255538918121028
ts['21/06/2017']
0.37255538918121028
ts['20170621']
0.37255538918121028
ts['2017-06']#傳入年或年月
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
2017-06-24 0.981214
2017-06-25 0.314127
2017-06-26 -0.127258
2017-06-27 1.919773
dtype: float64
ts['2017-06-20':'2017-06-23']#時(shí)間范圍進(jìn)行切片
2017-06-20 0.788811
2017-06-21 0.372555
2017-06-22 0.009967
2017-06-23 -1.024626
dtype: float64
帶有重復(fù)索引的時(shí)間序列
1).index.is_unique檢查索引日期是否是唯一的
2)對非唯一時(shí)間戳的數(shù)據(jù)進(jìn)行聚合,通過groupby,并傳入level = 0(索引的唯一一層)
dates = pd.DatetimeIndex(['2017/06/01','2017/06/02','2017/06/02','2017/06/02','2017/06/03'])
dates
DatetimeIndex(['2017-06-01', '2017-06-02', '2017-06-02', '2017-06-02',
'2017-06-03'],
dtype='datetime64[ns]', freq=None)
dup_ts = pd.Series(np.arange(5),index = dates)
dup_ts
2017-06-01 0
2017-06-02 1
2017-06-02 2
2017-06-02 3
2017-06-03 4
dtype: int32
dup_ts.index.is_unique
False
dup_ts['2017-06-02']
2017-06-02 1
2017-06-02 2
2017-06-02 3
dtype: int32
grouped = dup_ts.groupby(level=0).mean()
grouped
2017-06-01 0
2017-06-02 2
2017-06-03 4
dtype: int32
dup_df = pd.DataFrame(np.arange(10).reshape((5,2)),index = dates )
dup_df
|
0 |
1 |
2017-06-01 |
0 |
1 |
2017-06-02 |
2 |
3 |
2017-06-02 |
4 |
5 |
2017-06-02 |
6 |
7 |
2017-06-03 |
8 |
9 |
grouped_df = dup_df.groupby(level=0).mean()##針對DataFrame
grouped_df
|
0 |
1 |
2017-06-01 |
0 |
1 |
2017-06-02 |
4 |
5 |
2017-06-03 |
8 |
9 |
總結(jié)
該篇博客主要內(nèi)容:
1)字符串、日期的轉(zhuǎn)換方法
2)日期和時(shí)間的主要python,datetime、timedelta、pandas.to_datetime等
3)以時(shí)間為索引的Series和DataFrame的索引、切片
4)帶有重復(fù)時(shí)間索引時(shí)的索引,.groupby(level=0)應(yīng)用
|