第十六篇,數據分析之pandas的時間操作其一

時間的物理量與對象

在物理學有三個物理量(時刻,時間間隔,週期)都是跟時間相關的物理量,那我們pandas當然也有的。

時刻

時刻可以是年月日時分秒,也就是說,時刻是一個表示瞬時的量。
在python庫中也提供了時刻的對象類型,別忘了記得下載datatime模塊:pip install datatime。

import datetime
data = datetime.datetime.now() #輸出現在的時間,精通到秒
data1  = datetime.datetime(2016,6,1,12,30,30) #可以手動設置時間
print(data)
print(data1)
print(data.dayofyear) #輸出data是一年的第幾天
print(data.dayofweek) #輸出data是本週的第一天,從0開始
print(data.hour) #輸出data是今天的第多少個小時
2019-11-12 13:21:09.805246
2016-06-01 12:30:30
316
1
15

now()表示當前時刻,當然pandas中定義了一個名爲Timestamp類型的對象來描述這個物理量,別忘了導入pandas:import pandas as pd。:

data = pd.Timestamp.now()
print(data)

2019-11-12 13:25:17.403181

除了通過now()獲取到當前時刻的對象外,還可以通過實例化Timestamp類得到最指定時刻的Timestamp對象:

data = pd.Timestamp(datetime.datetime(2019,11,12))
data1 = pd.Timestamp(2019,11,12)
data2 = pd.Timestamp(2019-11-12)
print(data)
print(data1)
print(data2)

2019-11-12 00:00:00
2019-11-12 00:00:00
1970-01-01 00:00:00.000001996

以上都是不帶時區信息的時刻,如果帶時區就要通過tz參數進行聲明:

data = pd.Timestamp.now(tz='Asia/Shanghai')#現在上海時間
print(data)

2019-11-12 13:53:18.182142+08:00

時間間隔

data = pd.Timestamp.now(tz='Asia/Shanghai')
data1 = pd.Timestamp("1999-10-1",tz='Asia/Shanghai')
print(data-data1)

7347 days 14:11:52.691879

在物理學中如果一段時間間隔是data,則這個時間間隔可以和某個時刻做加減法運算,就是表示時刻像後或者向前推移data時間間隔,得到另一個時刻。
pandas中有一個叫Timedelta的一個類,於是就可以實例化Timedelta類得到一個表示某時間間隔的對象。

data = pd.Timedelta(days=1,hours=2,minutes=3,seconds=4)
print(data)

1 days 02:03:04

週期

什麼是週期:
有的時間間隔有一定的特殊性,比如0點到24點,每天都有這樣一個時間間隔,這種有規律不斷重複的時間間隔,就是週期。

data = pd.Period.now(freq='W')
print(data)
print(data.start_time)
print(data.end_time)

2019-11-11/2019-11-17
2019-11-11 00:00:00
2019-11-17 23:59:59.999999999

觀察data的輸出結果,包含了這周的起始及結尾時刻,也可以通過data這個對象來獲取這周的起始及結尾時刻的Timestamp對象。
上面所有引用的就是用來描述週期的Period對象,pd.Period.now(freq=‘W’)創建了當前時刻所在的這個星期的週期對象,當然也可以實例化週期對象,因爲週期對象有時間單位,年月天時分秒等,都可以使用freq這個參數來確定對象的週期頻率,W則表示獲取到data時刻的那一個星期

data = pd.Period('1999-10',freq='D')
print(data)

1999-10-01

也可以通過Timestamp對象,藉助freq的頻率創建Period對象。
假設data爲某時刻,如果以星期爲單位,就得到data所在的那個星期:

data = pd.Timestamp('1999-10-28')
print(data.to_period('W'))

1999-10-25/1999-10-31

最後,物理學的時刻,時間間隔,週期都被pandas中專有的三個數據對象Timestamp,Timedelta,Peroid所描述,既是類,也是對象,並且實列有相應的屬性。

比較相關模塊

在python裏面還有個dateutil的標準庫,以datatime爲基礎,提供了擴展的功能,別忘了安裝後導入模塊:from dateutil.parser import parse

data = '2016 6 1'
print(parse(data)) #它會自動幫你修正

2016-06-01 00:00:00

deteutil.parser被稱能夠解析所有時間和日期的字符串,除了能夠把字符串解析爲datatime外,還可以逆向操作。

data = parse('1999.10.28')
print(data)
print(data.strftime('%A'))

1999-10-28 00:00:00
Thursday

而外提一點,可能會出現時區不一樣,比如北京時間跟紐約時間都是不一樣的,這裏時區的設置要用到一個pytz模塊,記得安裝:

a = pytz.timezone('Europe/Brussels')
b = pytz.timezone('Asia/Shanghai')
data = datetime.datetime.now(tz=a)
data1 = data.replace(tzinfo=b)
print(data1 == data)

False

上面的data爲丹麥的布魯塞爾時區的當前時刻,data1的目的是講data的數值轉換爲上海時區的數值,就像在一個時鐘上面,兩個時區是不一樣的,所以返回false,但表示的都是同一時刻,數值可以不同,本質都是一個對象。
在NumPy也提供了一個針對時間的專有數據類型datetime64:

data = np.array('1999-10-28',dtype=np.datetime64)
print(data)

1999-10-28

datetime64類型的對象是以64位的精度存儲的,如果是以D(日)爲單位,則最大時間跨度就是2的64次方日,如果不指定單位的話,默認輸入時間的最小單位,否則就以指定單位爲準。

data = np.datetime64('2019-11-12') #默認單位爲月
print(data)
print(data.dtype)

2019-11-12
datetime64[D]
data = np.datetime64('2019-11-12','D')#默認單位爲日
print(data)
print(data.dtype)

2019-11-12
datetime64[D]
data = np.datetime64('2019-11-12 17:21:00') #默認單位爲秒
print(data)
print(data.dtype)

2019-11-12T17:21:00
datetime64[s]
data = np.datetime64('2019-11-12 17:21:00','ns')#默認單位爲納秒
print(data)
print(data.dtype)

2019-11-12T17:21:00.000000000
datetime64[ns]

NumPy中以datetime64爲數據類型所創建的數據,在處理日期時間就更加好用。

data = np.array('1999-10-28',dtype=np.datetime64)
print(data+np.arange(15))

['1999-10-28' '1999-10-29' '1999-10-30' '1999-10-31' '1999-11-01'
 '1999-11-02' '1999-11-03' '1999-11-04' '1999-11-05' '1999-11-06'
 '1999-11-07' '1999-11-08' '1999-11-09' '1999-11-10' '1999-11-11']

既然NumPy都有了當然少不了我的Pandas了

data = pd.to_datetime('2019-11-12')
print(data)
print(data.strftime('%A'))
print(data + pd.to_timedelta(np.arange(15),'D'))

2019-11-12 00:00:00
Tuesday
DatetimeIndex(['2019-11-12', '2019-11-13', '2019-11-14', '2019-11-15',
               '2019-11-16', '2019-11-17', '2019-11-18', '2019-11-19',
               '2019-11-20', '2019-11-21', '2019-11-22', '2019-11-23',
               '2019-11-24', '2019-11-25', '2019-11-26'],
              dtype='datetime64[ns]', freq=None)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章