国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Pandas的時(shí)間與日期(日期轉(zhuǎn)換,創(chuàng)建日期等)

這篇具有很好參考價(jià)值的文章主要介紹了Pandas的時(shí)間與日期(日期轉(zhuǎn)換,創(chuàng)建日期等)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

創(chuàng)建日期:

import pandas as pd
rng = pd.date_range('1/1/2011', periods=10958, freq='D')   # freq='D' 以天為間隔,
# periods=10958創(chuàng)建10958個(gè)

print(rng[:10958])
T = pd.DataFrame(rng[:10958])  # 創(chuàng)建10958個(gè)連續(xù)日期
T.to_csv('data05.csv')  # 保存

事實(shí)證明,熊貓作為處理時(shí)間序列數(shù)據(jù)的工具非常成功,特別是在財(cái)務(wù)數(shù)據(jù)分析領(lǐng)域。使用NumPy datetime64和timedelta64dtypes,我們整合了其他Python庫(kù)中的大量功能,scikits.timeseries并創(chuàng)建了大量用于處理時(shí)間序列數(shù)據(jù)的新功能。

在處理時(shí)間序列數(shù)據(jù)時(shí),我們會(huì)經(jīng)常尋求:

生成固定頻率日期和時(shí)間跨度的序列
使時(shí)間序列符合或轉(zhuǎn)換為特定頻率
根據(jù)各種非標(biāo)準(zhǔn)時(shí)間增量計(jì)算“相對(duì)”日期(例如,在一年的最后一個(gè)工作日之前的5個(gè)工作日),或向前或向后“滾動(dòng)”日期
pandas提供了一套相對(duì)緊湊且獨(dú)立的工具,用于執(zhí)行上述任務(wù)。

創(chuàng)建一系列日期:

In [1]: rng = pd.date_range('1/1/2011', periods=72, freq='H')
?
In [2]: rng[:5]
Out[2]:?
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 01:00:00',
? ? ? ? ? ? ? ?'2011-01-01 02:00:00', '2011-01-01 03:00:00',
? ? ? ? ? ? ? ?'2011-01-01 04:00:00'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='H')


帶有日期的索引pandas對(duì)象:

In [3]: ts = pd.Series(np.random.randn(len(rng)), index=rng)
?
In [4]: ts.head()
Out[4]:?
2011-01-01 00:00:00 ? ?0.469112
2011-01-01 01:00:00 ? -0.282863
2011-01-01 02:00:00 ? -1.509059
2011-01-01 03:00:00 ? -1.135632
2011-01-01 04:00:00 ? ?1.212112
Freq: H, dtype: float64


改變頻率和填補(bǔ)空白:

# 到45分鐘的頻率和前向填充

In [5]: converted = ts.asfreq('45Min', method='pad')
?
In [6]: converted.head()
Out[6]:?
2011-01-01 00:00:00 ? ?0.469112
2011-01-01 00:45:00 ? ?0.469112
2011-01-01 01:30:00 ? -0.282863
2011-01-01 02:15:00 ? -1.509059
2011-01-01 03:00:00 ? -1.135632
Freq: 45T, dtype: float64


將系列重新采樣到每日頻率:

# 日平均

In [7]: ts.resample('D').mean()
Out[7]:?
2011-01-01 ? -0.319569
2011-01-02 ? -0.337703
2011-01-03 ? ?0.117258
Freq: D, dtype: float64


?

概述
下表顯示了pandas可以處理的與時(shí)間相關(guān)的類的類型以及如何創(chuàng)建它們。

類?? ?備注?? ?如何創(chuàng)造
Timestamp?? ?表示單個(gè)時(shí)間戳?? ?to_datetime, Timestamp
DatetimeIndex?? ?指數(shù) Timestamp?? ?to_datetime,date_range,bdate_range,DatetimeIndex
Period?? ?表示單個(gè)時(shí)間跨度?? ?Period
PeriodIndex?? ?指數(shù) Period?? ?period_range, PeriodIndex
?

時(shí)間戳與時(shí)間跨度
帶時(shí)間戳的數(shù)據(jù)是將值與時(shí)間點(diǎn)相關(guān)聯(lián)的最基本類型的時(shí)間序列數(shù)據(jù)。對(duì)于pandas對(duì)象,它意味著使用時(shí)間點(diǎn)。

In [8]: pd.Timestamp(datetime(2012, 5, 1))
Out[8]: Timestamp('2012-05-01 00:00:00')
?
In [9]: pd.Timestamp('2012-05-01')
Out[9]: Timestamp('2012-05-01 00:00:00')
?
In [10]: pd.Timestamp(2012, 5, 1)
Out[10]: Timestamp('2012-05-01 00:00:00')


但是,在許多情況下,將變量變量與時(shí)間跨度相關(guān)聯(lián)更為自然。表示的范圍Period可以顯式指定,也可以從日期時(shí)間字符串格式推斷。

例如:

In [11]: pd.Period('2011-01')
Out[11]: Period('2011-01', 'M')
?
In [12]: pd.Period('2012-05', freq='D')
Out[12]: Period('2012-05-01', 'D')
Timestamp并Period可以作為索引。名單 Timestamp和Period被自動(dòng)強(qiáng)制轉(zhuǎn)換DatetimeIndex 和PeriodIndex分別。

In [13]: dates = [pd.Timestamp('2012-05-01'), pd.Timestamp('2012-05-02'), pd.Timestamp('2012-05-03')]
?
In [14]: ts = pd.Series(np.random.randn(3), dates)
?
In [15]: type(ts.index)
Out[15]: pandas.core.indexes.datetimes.DatetimeIndex
?
In [16]: ts.index
Out[16]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)
?
In [17]: ts
Out[17]:?
2012-05-01 ? -0.410001
2012-05-02 ? -0.078638
2012-05-03 ? ?0.545952
dtype: float64
?
In [18]: periods = [pd.Period('2012-01'), pd.Period('2012-02'), pd.Period('2012-03')]
?
In [19]: ts = pd.Series(np.random.randn(3), periods)
?
In [20]: type(ts.index)
Out[20]: pandas.core.indexes.period.PeriodIndex
?
In [21]: ts.index
Out[21]: PeriodIndex(['2012-01', '2012-02', '2012-03'], dtype='period[M]', freq='M')
?
In [22]: ts
Out[22]:?
2012-01 ? -1.219217
2012-02 ? -1.226825
2012-03 ? ?0.769804
Freq: M, dtype: float64


pandas允許您捕獲兩個(gè)表示并在它們之間進(jìn)行轉(zhuǎn)換。在引擎蓋下,pandas表示使用實(shí)例的時(shí)間戳的實(shí)例Timestamp和時(shí)間戳的時(shí)間戳 DatetimeIndex。對(duì)于常規(guī)時(shí)間跨度,pandas使用Period對(duì)象作為標(biāo)量值和PeriodIndex跨度序列。在未來的版本中,對(duì)具有任意起點(diǎn)和終點(diǎn)的不規(guī)則間隔的更好支持將會(huì)出現(xiàn)。

轉(zhuǎn)換為時(shí)間戳
要轉(zhuǎn)換Series類似日期的對(duì)象或類似列表的對(duì)象,例如字符串,紀(jì)元或混合,您可以使用該to_datetime函數(shù)。當(dāng)傳遞a時(shí)Series,它返回一個(gè)Series(具有相同的索引),而類似列表的轉(zhuǎn)換為DatetimeIndex:

In [23]: pd.to_datetime(pd.Series(['Jul 31, 2009', '2010-01-10', None]))
Out[23]:?
0 ? 2009-07-31
1 ? 2010-01-10
2 ? ? ? ? ?NaT
dtype: datetime64[ns]
?
In [24]: pd.to_datetime(['2005/11/23', '2010.12.31'])
Out[24]: DatetimeIndex(['2005-11-23', '2010-12-31'], dtype='datetime64[ns]', freq=None)
如果您使用從第一天開始的日期(即歐洲風(fēng)格),您可以傳遞dayfirst旗幟:

In [25]: pd.to_datetime(['04-01-2012 10:00'], dayfirst=True)
Out[25]: DatetimeIndex(['2012-01-04 10:00:00'], dtype='datetime64[ns]', freq=None)
?
In [26]: pd.to_datetime(['14-01-2012', '01-14-2012'], dayfirst=True)
Out[26]: DatetimeIndex(['2012-01-14', '2012-01-14'], dtype='datetime64[ns]', freq=None)


警告:您在上面的示例中看到dayfirst的并不嚴(yán)格,因此如果無(wú)法在第一天解析日期,則會(huì)將其解析為dayfirstFalse。

如果傳遞單個(gè)字符串to_datetime,則返回單個(gè)字符串Timestamp。 Timestamp也可以接受字符串輸入,但是它不接受像dayfirst或format那樣的字符串解析選項(xiàng),所以to_datetime如果需要這些選項(xiàng)則使用。

In [27]: pd.to_datetime('2010/11/12')
Out[27]: Timestamp('2010-11-12 00:00:00')
?
In [28]: pd.Timestamp('2010/11/12')
Out[28]: Timestamp('2010-11-12 00:00:00')


?

提供格式參數(shù)(指定時(shí)間格式)*
除了所需的日期時(shí)間字符串之外,format還可以傳遞參數(shù)以確保特定的解析。這也可能大大加快轉(zhuǎn)換速度。

In [29]: pd.to_datetime('2010/11/12', format='%Y/%m/%d')
Out[29]: Timestamp('2010-11-12 00:00:00')
?
In [30]: pd.to_datetime('12-11-2010 00:00', format='%d-%m-%Y %H:%M')
Out[30]: Timestamp('2010-11-12 00:00:00')


有關(guān)指定format 選項(xiàng)時(shí)可用選項(xiàng)的更多信息,請(qǐng)參閱Python datetime文檔。

從多個(gè)DataFrame列組裝日期時(shí)間
您也可以通過一個(gè)DataFrame整數(shù)或字符串列組裝成Series的Timestamps。

In [31]: df = pd.DataFrame({'year': [2015, 2016],
? ?....: ? ? ? ? ? ? ? ? ? ?'month': [2, 3],
? ?....: ? ? ? ? ? ? ? ? ? ?'day': [4, 5],
? ?....: ? ? ? ? ? ? ? ? ? ?'hour': [2, 3]})
? ?....:?
?
In [32]: pd.to_datetime(df)
Out[32]:?
0 ? 2015-02-04 02:00:00
1 ? 2016-03-05 03:00:00
dtype: datetime64[ns]


您只能傳遞需要組裝的列。

In [33]: pd.to_datetime(df[['year', 'month', 'day']])
Out[33]:?
0 ? 2015-02-04
1 ? 2016-03-05
dtype: datetime64[ns]
pd.to_datetime 在列名中查找datetime組件的標(biāo)準(zhǔn)名稱,包括:

要求:year,month,day
可選:hour,minute,second,millisecond,microsecond,nanosecond
?

無(wú)效數(shù)據(jù)
默認(rèn)行為errors='raise'是在不可解析時(shí)引發(fā):

In [2]: pd.to_datetime(['2009/07/31', 'asd'], errors='raise')
ValueError: Unknown string format
傳遞errors='ignore'以在不可解析時(shí)返回原始輸入:

In [34]: pd.to_datetime(['2009/07/31', 'asd'], errors='ignore')
Out[34]: array(['2009/07/31', 'asd'], dtype=object)
傳遞errors='coerce'將不可解析的數(shù)據(jù)轉(zhuǎn)換為NaT(不是時(shí)間):

In [35]: pd.to_datetime(['2009/07/31', 'asd'], errors='coerce')
Out[35]: DatetimeIndex(['2009-07-31', 'NaT'], dtype='datetime64[ns]', freq=None)
?

紀(jì)元時(shí)間戳
pandas支持將整數(shù)或浮點(diǎn)時(shí)間轉(zhuǎn)換為Timestamp和 DatetimeIndex。默認(rèn)單位是納秒,因?yàn)檫@是Timestamp 對(duì)象在內(nèi)部存儲(chǔ)的方式。但是,時(shí)期通常存儲(chǔ)在另一個(gè)unit 可以指定的時(shí)期。這些是從origin參數(shù)指定的起始點(diǎn)計(jì)算的 。

In [36]: pd.to_datetime([1349720105, 1349806505, 1349892905,
? ?....: ? ? ? ? ? ? ? ? 1349979305, 1350065705], unit='s')
? ?....:?
Out[36]:?
DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
? ? ? ? ? ? ? ?'2012-10-10 18:15:05', '2012-10-11 18:15:05',
? ? ? ? ? ? ? ?'2012-10-12 18:15:05'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq=None)
?
In [37]: pd.to_datetime([1349720105100, 1349720105200, 1349720105300,
? ?....: ? ? ? ? ? ? ? ? 1349720105400, 1349720105500 ], unit='ms')
? ?....:?
Out[37]:?
DatetimeIndex(['2012-10-08 18:15:05.100000', '2012-10-08 18:15:05.200000',
? ? ? ? ? ? ? ?'2012-10-08 18:15:05.300000', '2012-10-08 18:15:05.400000',
? ? ? ? ? ? ? ?'2012-10-08 18:15:05.500000'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq=None)

注意:大紀(jì)元時(shí)間將四舍五入到最接近的納秒。

警告:

浮動(dòng)紀(jì)元時(shí)間的轉(zhuǎn)換可能導(dǎo)致不準(zhǔn)確和意外的結(jié)果。 Python浮點(diǎn)數(shù)的十進(jìn)制精度約為15位。從浮動(dòng)到高精度的轉(zhuǎn)換過程中的舍入Timestamp是不可避免的。實(shí)現(xiàn)精確精度的唯一方法是使用固定寬度類型(例如int64)。

In [38]: pd.to_datetime([1490195805.433, 1490195805.433502912], unit='s')
Out[38]: DatetimeIndex(['2017-03-22 15:16:45.433000088', '2017-03-22 15:16:45.433502913'], dtype='datetime64[ns]', freq=None)
?
In [39]: pd.to_datetime(1490195805433502912, unit='ns')
Out[39]: Timestamp('2017-03-22 15:16:45.433502912')
?

從時(shí)間戳到紀(jì)元
要從上面反轉(zhuǎn)操作,即從a轉(zhuǎn)換Timestamp為'unix'時(shí)代:

In [40]: stamps = pd.date_range('2012-10-08 18:15:05', periods=4, freq='D')
?
In [41]: stamps
Out[41]:?
DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',
? ? ? ? ? ? ? ?'2012-10-10 18:15:05', '2012-10-11 18:15:05'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='D')
我們減去時(shí)期(UT??C時(shí)間1970年1月1日午夜),然后除以“單位”(1秒)。

In [42]: (stamps - pd.Timestamp("1970-01-01")) // pd.Timedelta('1s')
Out[42]: Int64Index([1349720105, 1349806505, 1349892905, 1349979305], dtype='int64')
?

使用origin參數(shù)
使用該origin參數(shù),可以指定創(chuàng)建a的替代起點(diǎn)DatetimeIndex。例如,要使用1960-01-01作為開始日期:

In [43]: pd.to_datetime([1, 2, 3], unit='D', origin=pd.Timestamp('1960-01-01'))
Out[43]: DatetimeIndex(['1960-01-02', '1960-01-03', '1960-01-04'], dtype='datetime64[ns]', freq=None)
默認(rèn)設(shè)置為origin='unix',默認(rèn)為。俗稱'unix epoch'或POSIX時(shí)間。1970-01-01 00:00:00

In [44]: pd.to_datetime([1, 2, 3], unit='D')
Out[44]: DatetimeIndex(['1970-01-02', '1970-01-03', '1970-01-04'], dtype='datetime64[ns]', freq=None)
?

生成時(shí)間戳范圍
要生成帶時(shí)間戳的索引,可以使用DatetimeIndex或 Index構(gòu)造函數(shù)并傳入datetime對(duì)象列表:

In [45]: dates = [datetime(2012, 5, 1), datetime(2012, 5, 2), datetime(2012, 5, 3)]
?
# Note the frequency information
In [46]: index = pd.DatetimeIndex(dates)
?
In [47]: index
Out[47]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)
?
# Automatically converted to DatetimeIndex
In [48]: index = pd.Index(dates)
?
In [49]: index
Out[49]: DatetimeIndex(['2012-05-01', '2012-05-02', '2012-05-03'], dtype='datetime64[ns]', freq=None)
在實(shí)踐中,這變得非常麻煩,因?yàn)槲覀兘?jīng)常需要具有大量時(shí)間戳的非常長(zhǎng)的索引。如果我們需要常規(guī)頻率的時(shí)間戳,我們可以使用date_range()和bdate_range()函數(shù)來創(chuàng)建一個(gè)DatetimeIndex。對(duì)于默認(rèn)頻率date_range為一個(gè) 日歷日,而默認(rèn)bdate_range是工作日:

In [50]: start = datetime(2011, 1, 1)
?
In [51]: end = datetime(2012, 1, 1)
?
In [52]: index = pd.date_range(start, end)
?
In [53]: index
Out[53]:?
DatetimeIndex(['2011-01-01', '2011-01-02', '2011-01-03', '2011-01-04',
? ? ? ? ? ? ? ?'2011-01-05', '2011-01-06', '2011-01-07', '2011-01-08',
? ? ? ? ? ? ? ?'2011-01-09', '2011-01-10',
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?'2011-12-23', '2011-12-24', '2011-12-25', '2011-12-26',
? ? ? ? ? ? ? ?'2011-12-27', '2011-12-28', '2011-12-29', '2011-12-30',
? ? ? ? ? ? ? ?'2011-12-31', '2012-01-01'],
? ? ? ? ? ? ? dtype='datetime64[ns]', length=366, freq='D')
?
In [54]: index = pd.bdate_range(start, end)
?
In [55]: index
Out[55]:?
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
? ? ? ? ? ? ? ?'2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12',
? ? ? ? ? ? ? ?'2011-01-13', '2011-01-14',
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?'2011-12-19', '2011-12-20', '2011-12-21', '2011-12-22',
? ? ? ? ? ? ? ?'2011-12-23', '2011-12-26', '2011-12-27', '2011-12-28',
? ? ? ? ? ? ? ?'2011-12-29', '2011-12-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', length=260, freq='B')

方便功能date_range,bdate_range可以使用各種頻率別名:

In [56]: pd.date_range(start, periods=1000, freq='M')
Out[56]:?
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-30',
? ? ? ? ? ? ? ?'2011-05-31', '2011-06-30', '2011-07-31', '2011-08-31',
? ? ? ? ? ? ? ?'2011-09-30', '2011-10-31',
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?'2093-07-31', '2093-08-31', '2093-09-30', '2093-10-31',
? ? ? ? ? ? ? ?'2093-11-30', '2093-12-31', '2094-01-31', '2094-02-28',
? ? ? ? ? ? ? ?'2094-03-31', '2094-04-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', length=1000, freq='M')
?
In [57]: pd.bdate_range(start, periods=250, freq='BQS')
Out[57]:?
DatetimeIndex(['2011-01-03', '2011-04-01', '2011-07-01', '2011-10-03',
? ? ? ? ? ? ? ?'2012-01-02', '2012-04-02', '2012-07-02', '2012-10-01',
? ? ? ? ? ? ? ?'2013-01-01', '2013-04-01',
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?'2071-01-01', '2071-04-01', '2071-07-01', '2071-10-01',
? ? ? ? ? ? ? ?'2072-01-01', '2072-04-01', '2072-07-01', '2072-10-03',
? ? ? ? ? ? ? ?'2073-01-02', '2073-04-03'],
? ? ? ? ? ? ? dtype='datetime64[ns]', length=250, freq='BQS-JAN')

date_range并且bdate_range可以很容易地使用的參數(shù)的各種組合等生成日期的范圍start,end,periods,和freq。開始日期和結(jié)束日期是嚴(yán)格包含的,因此不會(huì)生成指定日期之外的日期:

In [58]: pd.date_range(start, end, freq='BM')
Out[58]:?
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
? ? ? ? ? ? ? ?'2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
? ? ? ? ? ? ? ?'2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='BM')
?
In [59]: pd.date_range(start, end, freq='W')
Out[59]:?
DatetimeIndex(['2011-01-02', '2011-01-09', '2011-01-16', '2011-01-23',
? ? ? ? ? ? ? ?'2011-01-30', '2011-02-06', '2011-02-13', '2011-02-20',
? ? ? ? ? ? ? ?'2011-02-27', '2011-03-06', '2011-03-13', '2011-03-20',
? ? ? ? ? ? ? ?'2011-03-27', '2011-04-03', '2011-04-10', '2011-04-17',
? ? ? ? ? ? ? ?'2011-04-24', '2011-05-01', '2011-05-08', '2011-05-15',
? ? ? ? ? ? ? ?'2011-05-22', '2011-05-29', '2011-06-05', '2011-06-12',
? ? ? ? ? ? ? ?'2011-06-19', '2011-06-26', '2011-07-03', '2011-07-10',
? ? ? ? ? ? ? ?'2011-07-17', '2011-07-24', '2011-07-31', '2011-08-07',
? ? ? ? ? ? ? ?'2011-08-14', '2011-08-21', '2011-08-28', '2011-09-04',
? ? ? ? ? ? ? ?'2011-09-11', '2011-09-18', '2011-09-25', '2011-10-02',
? ? ? ? ? ? ? ?'2011-10-09', '2011-10-16', '2011-10-23', '2011-10-30',
? ? ? ? ? ? ? ?'2011-11-06', '2011-11-13', '2011-11-20', '2011-11-27',
? ? ? ? ? ? ? ?'2011-12-04', '2011-12-11', '2011-12-18', '2011-12-25',
? ? ? ? ? ? ? ?'2012-01-01'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='W-SUN')
?
In [60]: pd.bdate_range(end=end, periods=20)
Out[60]:?
DatetimeIndex(['2011-12-05', '2011-12-06', '2011-12-07', '2011-12-08',
? ? ? ? ? ? ? ?'2011-12-09', '2011-12-12', '2011-12-13', '2011-12-14',
? ? ? ? ? ? ? ?'2011-12-15', '2011-12-16', '2011-12-19', '2011-12-20',
? ? ? ? ? ? ? ?'2011-12-21', '2011-12-22', '2011-12-23', '2011-12-26',
? ? ? ? ? ? ? ?'2011-12-27', '2011-12-28', '2011-12-29', '2011-12-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='B')
?
In [61]: pd.bdate_range(start=start, periods=20)
Out[61]:?
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
? ? ? ? ? ? ? ?'2011-01-07', '2011-01-10', '2011-01-11', '2011-01-12',
? ? ? ? ? ? ? ?'2011-01-13', '2011-01-14', '2011-01-17', '2011-01-18',
? ? ? ? ? ? ? ?'2011-01-19', '2011-01-20', '2011-01-21', '2011-01-24',
? ? ? ? ? ? ? ?'2011-01-25', '2011-01-26', '2011-01-27', '2011-01-28'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='B')

版本0.23.0中的新功能。

指定start,end和periods將生成一系列均勻間隔的日期,start從而end包含,結(jié)果中包含periods多個(gè)元素DatetimeIndex:

In [62]: pd.date_range('2018-01-01', '2018-01-05', periods=5)
Out[62]:?
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04',
? ? ? ? ? ? ? ?'2018-01-05'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq=None)
?
In [63]: pd.date_range('2018-01-01', '2018-01-05', periods=10)
Out[63]:?
DatetimeIndex(['2018-01-01 00:00:00', '2018-01-01 10:40:00',
? ? ? ? ? ? ? ?'2018-01-01 21:20:00', '2018-01-02 08:00:00',
? ? ? ? ? ? ? ?'2018-01-02 18:40:00', '2018-01-03 05:20:00',
? ? ? ? ? ? ? ?'2018-01-03 16:00:00', '2018-01-04 02:40:00',
? ? ? ? ? ? ? ?'2018-01-04 13:20:00', '2018-01-05 00:00:00'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq=None)
?

自定義頻率范圍
警告:此功能最初是獨(dú)占的cdate_range,從版本0.21.0開始不贊成使用bdate_range。請(qǐng)注意, cdate_range僅在自定義工作日“C”作為頻率字符串傳遞時(shí)才使用weekmask和holidays參數(shù)。支持已經(jīng)擴(kuò)展,bdate_range可以使用任何自定義頻率字符串。

版本0.21.0中的新功能。

bdate_range還可以使用weekmask和holidays參數(shù)生成一系列自定義頻率日期。僅在傳遞自定義頻率字符串時(shí)才使用這些參數(shù)。

In [64]: weekmask = 'Mon Wed Fri'
?
In [65]: holidays = [datetime(2011, 1, 5), datetime(2011, 3, 14)]
?
In [66]: pd.bdate_range(start, end, freq='C', weekmask=weekmask, holidays=holidays)
Out[66]:?
DatetimeIndex(['2011-01-03', '2011-01-07', '2011-01-10', '2011-01-12',
? ? ? ? ? ? ? ?'2011-01-14', '2011-01-17', '2011-01-19', '2011-01-21',
? ? ? ? ? ? ? ?'2011-01-24', '2011-01-26',
? ? ? ? ? ? ? ?...
? ? ? ? ? ? ? ?'2011-12-09', '2011-12-12', '2011-12-14', '2011-12-16',
? ? ? ? ? ? ? ?'2011-12-19', '2011-12-21', '2011-12-23', '2011-12-26',
? ? ? ? ? ? ? ?'2011-12-28', '2011-12-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', length=154, freq='C')
?
In [67]: pd.bdate_range(start, end, freq='CBMS', weekmask=weekmask)
Out[67]:?
DatetimeIndex(['2011-01-03', '2011-02-02', '2011-03-02', '2011-04-01',
? ? ? ? ? ? ? ?'2011-05-02', '2011-06-01', '2011-07-01', '2011-08-01',
? ? ? ? ? ? ? ?'2011-09-02', '2011-10-03', '2011-11-02', '2011-12-02'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='CBMS')

時(shí)間戳限制
由于pandas表示以納秒分辨率表示的時(shí)間戳,因此使用64位整數(shù)表示的時(shí)間跨度限制為大約584年:

In [68]: pd.Timestamp.min
Out[68]: Timestamp('1677-09-21 00:12:43.145225')
?
In [69]: pd.Timestamp.max
Out[69]: Timestamp('2262-04-11 23:47:16.854775807')
?

索引
其中一個(gè)主要用途DatetimeIndex是作為pandas對(duì)象的索引。本DatetimeIndex類包含許多時(shí)間序列相關(guān)的優(yōu)化:

各種偏移的大范圍日期被預(yù)先計(jì)算并緩存在引擎蓋下,以便非??斓厣珊罄m(xù)日期范圍(只需抓取一個(gè)切片)。
使用pandas對(duì)象上的shiftand tshift方法快速移動(dòng)。
DatetimeIndex具有相同頻率的重疊對(duì)象的聯(lián)合非??欤▽?duì)于快速數(shù)據(jù)對(duì)齊很重要)。
通過性能,如快速訪問日期字段year,month等等。
正則化功能snap和非常快速的asof邏輯。
DatetimeIndex對(duì)象具有常規(guī)Index 對(duì)象的所有基本功能,以及高級(jí)時(shí)間序列特定方法的大雜燴,便于頻率處理。

注意:雖然pandas不會(huì)強(qiáng)制您使用已排序的日期索引,但如果日期未排序,則某些方法可能會(huì)出現(xiàn)意外或不正確的行為。

DatetimeIndex 可以像常規(guī)索引一樣使用,并提供所有智能功能,如選擇,切片等。

In [70]: rng = pd.date_range(start, end, freq='BM')
?
In [71]: ts = pd.Series(np.random.randn(len(rng)), index=rng)
?
In [72]: ts.index
Out[72]:?
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
? ? ? ? ? ? ? ?'2011-05-31', '2011-06-30', '2011-07-29', '2011-08-31',
? ? ? ? ? ? ? ?'2011-09-30', '2011-10-31', '2011-11-30', '2011-12-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='BM')
?
In [73]: ts[:5].index
Out[73]:?
DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31', '2011-04-29',
? ? ? ? ? ? ? ?'2011-05-31'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='BM')
?
In [74]: ts[::2].index
Out[74]:?
DatetimeIndex(['2011-01-31', '2011-03-31', '2011-05-31', '2011-07-29',
? ? ? ? ? ? ? ?'2011-09-30', '2011-11-30'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='2BM')

部分字符串索引
解析為時(shí)間戳的日期和字符串可以作為索引參數(shù)傳遞:

In [75]: ts['1/31/2011']
Out[75]: -1.2812473076599531
?
In [76]: ts[datetime(2011, 12, 25):]
Out[76]:?
2011-12-30 ? ?0.687738
Freq: BM, dtype: float64
?
In [77]: ts['10/31/2011':'12/31/2011']
Out[77]:?
2011-10-31 ? ?0.149748
2011-11-30 ? -0.732339
2011-12-30 ? ?0.687738
Freq: BM, dtype: float64
為了方便訪問更長(zhǎng)的時(shí)間序列,您還可以將年份或年份和月份作為字符串傳遞:

In [78]: ts['2011']
Out[78]:?
2011-01-31 ? -1.281247
2011-02-28 ? -0.727707
2011-03-31 ? -0.121306
2011-04-29 ? -0.097883
2011-05-31 ? ?0.695775
2011-06-30 ? ?0.341734
2011-07-29 ? ?0.959726
2011-08-31 ? -1.110336
2011-09-30 ? -0.619976
2011-10-31 ? ?0.149748
2011-11-30 ? -0.732339
2011-12-30 ? ?0.687738
Freq: BM, dtype: float64
?
In [79]: ts['2011-6']
Out[79]:?
2011-06-30 ? ?0.341734
Freq: BM, dtype: float64

這種類型的切片將在一個(gè)工作DataFrame用DatetimeIndex為好。由于部分字符串選擇是標(biāo)簽切片的一種形式,因此將包括端點(diǎn)。這將包括在包含日期的匹配時(shí)間:

In [80]: dft = pd.DataFrame(randn(100000,1),
? ?....: ? ? ? ? ? ? ? ? ? ?columns=['A'],
? ?....: ? ? ? ? ? ? ? ? ? ?index=pd.date_range('20130101',periods=100000,freq='T'))
? ?....:?
?
In [81]: dft
Out[81]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-03-11 10:33:00 -0.293083
2013-03-11 10:34:00 -0.059881
2013-03-11 10:35:00 ?1.252450
2013-03-11 10:36:00 ?0.046611
2013-03-11 10:37:00 ?0.059478
2013-03-11 10:38:00 -0.286539
2013-03-11 10:39:00 ?0.841669
?
[100000 rows x 1 columns]
?
In [82]: dft['2013']
Out[82]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-03-11 10:33:00 -0.293083
2013-03-11 10:34:00 -0.059881
2013-03-11 10:35:00 ?1.252450
2013-03-11 10:36:00 ?0.046611
2013-03-11 10:37:00 ?0.059478
2013-03-11 10:38:00 -0.286539
2013-03-11 10:39:00 ?0.841669
?
[100000 rows x 1 columns]

這是在本月的第一次開始,包括該月的最后日期和時(shí)間:

In [83]: dft['2013-1':'2013-2']
Out[83]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-02-28 23:53:00 ?0.103114
2013-02-28 23:54:00 -1.303422
2013-02-28 23:55:00 ?0.451943
2013-02-28 23:56:00 ?0.220534
2013-02-28 23:57:00 -1.624220
2013-02-28 23:58:00 ?0.093915
2013-02-28 23:59:00 -1.087454
?
[84960 rows x 1 columns]

這指定了包含最后一天所有時(shí)間的停止時(shí)間:

In [84]: dft['2013-1':'2013-2-28']
Out[84]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-02-28 23:53:00 ?0.103114
2013-02-28 23:54:00 -1.303422
2013-02-28 23:55:00 ?0.451943
2013-02-28 23:56:00 ?0.220534
2013-02-28 23:57:00 -1.624220
2013-02-28 23:58:00 ?0.093915
2013-02-28 23:59:00 -1.087454
?
[84960 rows x 1 columns]

這指定了確切的停止時(shí)間(并且與上面的不同):

In [85]: dft['2013-1':'2013-2-28 00:00:00']
Out[85]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-02-27 23:54:00 ?0.897051
2013-02-27 23:55:00 -0.309230
2013-02-27 23:56:00 ?1.944713
2013-02-27 23:57:00 ?0.369265
2013-02-27 23:58:00 ?0.053071
2013-02-27 23:59:00 -0.019734
2013-02-28 00:00:00 ?1.388189
?
[83521 rows x 1 columns]

我們正在停止包含的終點(diǎn),因?yàn)樗撬饕囊徊糠郑?/p>

In [86]: dft['2013-1-15':'2013-1-15 12:30:00']
Out[86]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-15 00:00:00 ?0.501288
2013-01-15 00:01:00 -0.605198
2013-01-15 00:02:00 ?0.215146
2013-01-15 00:03:00 ?0.924732
2013-01-15 00:04:00 -2.228519
2013-01-15 00:05:00 ?1.517331
2013-01-15 00:06:00 -1.188774
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-01-15 12:24:00 ?1.358314
2013-01-15 12:25:00 -0.737727
2013-01-15 12:26:00 ?1.838323
2013-01-15 12:27:00 -0.774090
2013-01-15 12:28:00 ?0.622261
2013-01-15 12:29:00 -0.631649
2013-01-15 12:30:00 ?0.193284
?
[751 rows x 1 columns]

版本0.18.0中的新功能。

DatetimeIndex部分字符串索引也適用于DataFramea MultiIndex:

In [87]: dft2 = pd.DataFrame(np.random.randn(20, 1),
? ?....: ? ? ? ? ? ? ? ? ? ? columns=['A'],
? ?....: ? ? ? ? ? ? ? ? ? ? index=pd.MultiIndex.from_product([pd.date_range('20130101',
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? periods=10,
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? freq='12H'),
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?['a', 'b']]))
? ?....:?
?
In [88]: dft2
Out[88]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 a -0.659574
? ? ? ? ? ? ? ? ? ? b ?1.494522
2013-01-01 12:00:00 a -0.778425
? ? ? ? ? ? ? ? ? ? b -0.253355
2013-01-02 00:00:00 a -2.816159
? ? ? ? ? ? ? ? ? ? b -1.210929
2013-01-02 12:00:00 a ?0.144669
... ? ? ? ? ? ? ? ? ? ? ? ? ...
2013-01-04 00:00:00 b -1.624463
2013-01-04 12:00:00 a ?0.056912
? ? ? ? ? ? ? ? ? ? b ?0.149867
2013-01-05 00:00:00 a -1.256173
? ? ? ? ? ? ? ? ? ? b ?2.324544
2013-01-05 12:00:00 a -1.067396
? ? ? ? ? ? ? ? ? ? b -0.660996
?
[20 rows x 1 columns]
?
In [89]: dft2.loc['2013-01-05']
Out[89]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-05 00:00:00 a -1.256173
? ? ? ? ? ? ? ? ? ? b ?2.324544
2013-01-05 12:00:00 a -1.067396
? ? ? ? ? ? ? ? ? ? b -0.660996
?
In [90]: idx = pd.IndexSlice
?
In [91]: dft2 = dft2.swaplevel(0, 1).sort_index()
?
In [92]: dft2.loc[idx[:, '2013-01-05'], :]
Out[92]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A
a 2013-01-05 00:00:00 -1.256173
? 2013-01-05 12:00:00 -1.067396
b 2013-01-05 00:00:00 ?2.324544
? 2013-01-05 12:00:00 -0.660996

切片與精確匹配
版本0.20.0已更改。

用作索引參數(shù)的相同字符串可以被視為切片或完全匹配,具體取決于索引的分辨率。如果字符串不如索引準(zhǔn)確,則將其視為切片,否則視為完全匹配。

考慮Series具有分鐘分辨率索引的對(duì)象:

In [93]: series_minute = pd.Series([1, 2, 3],
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? pd.DatetimeIndex(['2011-12-31 23:59:00',
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-01-01 00:00:00',
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-01-01 00:02:00']))
? ?....:?
?
In [94]: series_minute.index.resolution
Out[94]: 'minute'
時(shí)間戳字符串不如一分鐘準(zhǔn)確給出一個(gè)Series對(duì)象。

In [95]: series_minute['2011-12-31 23']
Out[95]:?
2011-12-31 23:59:00 ? ?1
dtype: int64
具有分鐘分辨率(或更準(zhǔn)確)的時(shí)間戳字符串,而是給出標(biāo)量,即它不會(huì)轉(zhuǎn)換為切片。

In [96]: series_minute['2011-12-31 23:59']
Out[96]: 1
?
In [97]: series_minute['2011-12-31 23:59:00']
Out[97]: 1
如果索引分辨率是秒,那么分鐘準(zhǔn)確的時(shí)間戳給出了 Series。

In [98]: series_second = pd.Series([1, 2, 3],
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? pd.DatetimeIndex(['2011-12-31 23:59:59',
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-01-01 00:00:00',
? ?....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-01-01 00:00:01']))
? ?....:?
?
In [99]: series_second.index.resolution
Out[99]: 'second'
?
In [100]: series_second['2011-12-31 23:59']
Out[100]:?
2011-12-31 23:59:59 ? ?1
dtype: int64
如果時(shí)間戳字符串作為一個(gè)切片進(jìn)行處理,它可被用于索引DataFrame與[]為好。

In [101]: dft_minute = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6]},
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? ?index=series_minute.index)
? ?.....:?
?
In [102]: dft_minute['2011-12-31 23']
Out[102]:?
? ? ? ? ? ? ? ? ? ? ?a ?b
2011-12-31 23:59:00 ?1 ?4
?

警告:但是,如果將字符串視為完全匹配,則DataFrames中的選擇[]將按列而不是按行進(jìn)行,請(qǐng)參閱索引基礎(chǔ)知識(shí)。例如將提高為具有相同的分辨率指標(biāo),有這樣的名字沒有列:dft_minute['2011-12-31 23:59']KeyError'2012-12-31 23:59'

要始終具有明確的選擇,無(wú)論該行是被視為切片還是單個(gè)選擇,請(qǐng)使用.loc。

In [103]: dft_minute.loc['2011-12-31 23:59']
Out[103]:?
a ? ?1
b ? ?4
Name: 2011-12-31 23:59:00, dtype: int64
?

還要注意,DatetimeIndex分辨率不能比白天精確。

In [104]: series_monthly = pd.Series([1, 2, 3],
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? pd.DatetimeIndex(['2011-12',
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-01',
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? '2012-02']))
? ?.....:?
?
In [105]: series_monthly.index.resolution
Out[105]: 'day'
?
In [106]: series_monthly['2011-12'] # returns Series
Out[106]:?
2011-12-01 ? ?1
dtype: int64
?

精確索引
如前一節(jié)所述DatetimeIndex,使用部分字符串索引a 取決于句點(diǎn)的“準(zhǔn)確性”,換句話說,間隔與索引的分辨率有何關(guān)聯(lián)。相比之下,使用Timestamp或datetime對(duì)象進(jìn)行索引是準(zhǔn)確的,因?yàn)閷?duì)象具有確切的含義。這些也遵循包含兩個(gè)端點(diǎn)的語(yǔ)義。

這些Timestamp和datetime對(duì)象有確切的和,即使他們沒有明確規(guī)定(他們是)。hours, minutes,seconds0

In [107]: dft[datetime(2013, 1, 1):datetime(2013,2,28)]
Out[107]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 00:00:00 ?0.176444
2013-01-01 00:01:00 ?0.403310
2013-01-01 00:02:00 -0.154951
2013-01-01 00:03:00 ?0.301624
2013-01-01 00:04:00 -2.179861
2013-01-01 00:05:00 -1.369849
2013-01-01 00:06:00 -0.954208
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-02-27 23:54:00 ?0.897051
2013-02-27 23:55:00 -0.309230
2013-02-27 23:56:00 ?1.944713
2013-02-27 23:57:00 ?0.369265
2013-02-27 23:58:00 ?0.053071
2013-02-27 23:59:00 -0.019734
2013-02-28 00:00:00 ?1.388189
?
[83521 rows x 1 columns]

沒有默認(rèn)值。

In [108]: dft[datetime(2013, 1, 1, 10, 12, 0):datetime(2013, 2, 28, 10, 12, 0)]
Out[108]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A
2013-01-01 10:12:00 -0.246733
2013-01-01 10:13:00 -1.429225
2013-01-01 10:14:00 -1.265339
2013-01-01 10:15:00 ?0.710986
2013-01-01 10:16:00 -0.818200
2013-01-01 10:17:00 ?0.543542
2013-01-01 10:18:00 ?1.577713
... ? ? ? ? ? ? ? ? ? ? ? ...
2013-02-28 10:06:00 ?0.311249
2013-02-28 10:07:00 ?2.366080
2013-02-28 10:08:00 -0.490372
2013-02-28 10:09:00 ?0.373340
2013-02-28 10:10:00 ?0.638442
2013-02-28 10:11:00 ?1.330135
2013-02-28 10:12:00 -0.945450
?
[83521 rows x 1 columns]

截?cái)嗪突ㄊ剿饕?br> 甲truncate()提供方便的功能類似于切片。請(qǐng)注意,truncate對(duì)于任何未指定的日期組件,假設(shè)為0 DatetimeIndex,與切片相反,返回任何部分匹配的日期:

In [109]: rng2 = pd.date_range('2011-01-01', '2012-01-01', freq='W')
?
In [110]: ts2 = pd.Series(np.random.randn(len(rng2)), index=rng2)
?
In [111]: ts2.truncate(before='2011-11', after='2011-12')
Out[111]:?
2011-11-06 ? -0.773743
2011-11-13 ? ?0.247216
2011-11-20 ? ?0.591308
2011-11-27 ? ?2.228500
Freq: W-SUN, dtype: float64
?
In [112]: ts2['2011-11':'2011-12']
Out[112]:?
2011-11-06 ? -0.773743
2011-11-13 ? ?0.247216
2011-11-20 ? ?0.591308
2011-11-27 ? ?2.228500
2011-12-04 ? ?0.838769
2011-12-11 ? ?0.658538
2011-12-18 ? ?0.567353
2011-12-25 ? -1.076735
Freq: W-SUN, dtype: float64

即使復(fù)雜的花式索引打破了DatetimeIndex頻率規(guī)律也會(huì)導(dǎo)致a DatetimeIndex,雖然頻率會(huì)丟失:

In [113]: ts2[[0, 2, 6]].index
Out[113]: DatetimeIndex(['2011-01-02', '2011-01-16', '2011-02-13'], dtype='datetime64[ns]', freq=None)
?

時(shí)間/日期組件
有一些時(shí)間/日期屬性可供人們?cè)L問,Timestamp或者有一組時(shí)間戳,如a DatetimeIndex。

屬性?? ?描述
year?? ?日期時(shí)間
month?? ?日期時(shí)間的月份
day?? ?日期時(shí)間的日子
hour?? ?日期時(shí)間的小時(shí)
minute?? ?日期時(shí)間的分鐘
second?? ?日期時(shí)間的秒數(shù)
ms?? ?日期時(shí)間的微秒
ns?? ?日期時(shí)間的納秒
date?? ?返回datetime.date(不包含時(shí)區(qū)信息)
time?? ?返回datetime.time(不包含時(shí)區(qū)信息)
DAYOFYEAR?? ?一年中的序數(shù)日
WEEKOFYEAR?? ?一年中的一周序數(shù)
week?? ?一年中的一周序數(shù)
dayofweek?? ?星期一= 0,星期日= 6的星期幾
weekday?? ?星期一= 0,星期日= 6的星期幾
weekday_name?? ?一周中的一天的名字(例如:星期五)
quarter?? ?日期的四分之一:Jan-Mar = 1,Apr-Jun = 2等
days_in_month?? ?日期時(shí)間的月份天數(shù)
is_month_start?? ?邏輯指示是否每月的第一天(由頻率定義)
is_month_end?? ?邏輯指示是否每月的最后一天(由頻率定義)
is_quarter_start?? ?邏輯指示季度的第一天(由頻率定義)
is_quarter_end?? ?邏輯指示是否是季度的最后一天(由頻率定義)
is_year_start?? ?邏輯指示年份的第一天(由頻率定義)
is_year_end?? ?邏輯指示年份的最后一天(由頻率定義)
is_leap_year?? ?邏輯指示日期是否屬于閏年
此外,如果您具有Seriesdatetimelike值,則可以通過訪問器訪問這些屬性.dt,詳見.dt訪問器一節(jié)。

DateOffset對(duì)象(時(shí)間量偏移方法)*
在前面的例子中,我們DatetimeIndex通過將 諸如“M”,“W”和“BM”的頻率字符串傳遞給freq關(guān)鍵字來創(chuàng)建各種頻率的對(duì)象。在引擎蓋下,這些頻率字符串被轉(zhuǎn)換為實(shí)例DateOffset,其表示常規(guī)頻率增量。“月”,“營(yíng)業(yè)日”或“一小時(shí)”等特定偏移邏輯在其各個(gè)子類中表示。

類別名稱?? ?描述
DateOffset?? ?通用偏移類,默認(rèn)為1個(gè)日歷日
BDAY?? ?營(yíng)業(yè)日(工作日)
CDay?? ?自定義工作日
Week?? ?一周,任選地固定在一周的一天
WeekOfMonth?? ?每個(gè)月的第y周的第x天
LastWeekOfMonth?? ?每個(gè)月最后一周的第x天
MonthEnd?? ?日歷月結(jié)束
MonthBegin?? ?日歷月開始
BMonthEnd?? ?營(yíng)業(yè)月末
BMonthBegin?? ?營(yíng)業(yè)月開始
CBMonthEnd?? ?定制業(yè)務(wù)月末
CBMonthBegin?? ?自定義營(yíng)業(yè)月開始
SemiMonthEnd?? ?15日(或其他日__月)和日歷月結(jié)束
SemiMonthBegin?? ?15日(或其他日__月)和日歷月開始
QuarterEnd?? ?日歷季結(jié)束
QuarterBegin?? ?日歷季開始
BQuarterEnd?? ?業(yè)務(wù)季結(jié)束
BQuarterBegin?? ?營(yíng)業(yè)季開始
FY5253Quarter?? ?零售(又名52-53周)季度
YearEnd?? ?日歷年結(jié)束
YearBegin?? ?日歷年開始
BYearEnd?? ?業(yè)務(wù)年度結(jié)束
BYearBegin?? ?營(yíng)業(yè)年開始
FY5253?? ?零售(又名52-53周)年
BusinessHour?? ?營(yíng)業(yè)時(shí)間
CustomBusinessHour?? ?定制營(yíng)業(yè)時(shí)間
Hour?? ?一小時(shí)
Minute?? ?一分鐘
Second?? ?一秒
Milli?? ?一毫秒
Micro?? ?一微秒
Nano?? ?一納秒
基本DateOffset采用相同的參數(shù) dateutil.relativedelta,其工作方式如下:

In [114]: d = datetime(2008, 8, 18, 9, 0)
?
In [115]: d + relativedelta(months=4, days=5)
Out[115]: datetime.datetime(2008, 12, 23, 9, 0)
我們可以做同樣的事情DateOffset:

In [116]: from pandas.tseries.offsets import *
?
In [117]: d + DateOffset(months=4, days=5)
Out[117]: Timestamp('2008-12-23 09:00:00')
DateOffset對(duì)象的主要特征是:

可以向/從日期時(shí)間對(duì)象添加/減去它以獲得移位日期。
它可以乘以整數(shù)(正數(shù)或負(fù)數(shù)),以便多次應(yīng)用增量。
它具有rollforward()和 rollback()用于向前或向后移動(dòng)日期下一首或上“抵消日期”的方法。
DateOffset定義指定apply自定義日期增量邏輯的函數(shù)的子類,例如添加工作日:

class BDay(DateOffset):
? ? """工作日之間的DateOffset遞增"""
? ? def apply(self, other):
? ? ? ? ...
In [118]: d - 5 * BDay()
Out[118]: Timestamp('2008-08-11 09:00:00')
?
In [119]: d + BMonthEnd()
Out[119]: Timestamp('2008-08-29 09:00:00')
該rollforward和rollback方法做的正是你所期待的:

In [120]: d
Out[120]: datetime.datetime(2008, 8, 18, 9, 0)
?
In [121]: offset = BMonthEnd()
?
In [122]: offset.rollforward(d)
Out[122]: Timestamp('2008-08-29 09:00:00')
?
In [123]: offset.rollback(d)
Out[123]: Timestamp('2008-07-31 09:00:00')
絕對(duì)值得探索pandas.tseries.offsets模塊和類的各種docstrings。

這些操作(apply,rollforward和rollback)保存時(shí)間(小時(shí),分鐘等)的默認(rèn)信息。要重置時(shí)間,請(qǐng)normalize=True 在創(chuàng)建偏移實(shí)例時(shí)使用。如果normalize=True,則在應(yīng)用函數(shù)后對(duì)結(jié)果進(jìn)行歸一化。

In [124]: day = Day()
?
In [125]: day.apply(pd.Timestamp('2014-01-01 09:00'))
Out[125]: Timestamp('2014-01-02 09:00:00')
?
In [126]: day = Day(normalize=True)
?
In [127]: day.apply(pd.Timestamp('2014-01-01 09:00'))
Out[127]: Timestamp('2014-01-02 00:00:00')
?
In [128]: hour = Hour()
?
In [129]: hour.apply(pd.Timestamp('2014-01-01 22:00'))
Out[129]: Timestamp('2014-01-01 23:00:00')
?
In [130]: hour = Hour(normalize=True)
?
In [131]: hour.apply(pd.Timestamp('2014-01-01 22:00'))
Out[131]: Timestamp('2014-01-01 00:00:00')
?
In [132]: hour.apply(pd.Timestamp('2014-01-01 23:00'))
Out[132]: Timestamp('2014-01-02 00:00:00')

參數(shù)偏移
創(chuàng)建時(shí),某些偏移可以“參數(shù)化”以產(chǎn)生不同的行為。例如,Week生成每周數(shù)據(jù)的偏移量接受一個(gè)weekday參數(shù),該 參數(shù)導(dǎo)致生成的日期始終位于一周中的特定日期:

In [133]: d
Out[133]: datetime.datetime(2008, 8, 18, 9, 0)
?
In [134]: d + Week()
Out[134]: Timestamp('2008-08-25 09:00:00')
?
In [135]: d + Week(weekday=4)
Out[135]: Timestamp('2008-08-22 09:00:00')
?
In [136]: (d + Week(weekday=4)).weekday()
Out[136]: 4
?
In [137]: d - Week()
Out[137]: Timestamp('2008-08-11 09:00:00')
該normalize選項(xiàng)對(duì)加法和減法有效。

In [138]: d + Week(normalize=True)
Out[138]: Timestamp('2008-08-25 00:00:00')
?
In [139]: d - Week(normalize=True)
Out[139]: Timestamp('2008-08-11 00:00:00')
另一個(gè)例子是YearEnd使用特定的結(jié)束月份進(jìn)行參數(shù)化:

In [140]: d + YearEnd()
Out[140]: Timestamp('2008-12-31 09:00:00')
?
In [141]: d + YearEnd(month=6)
Out[141]: Timestamp('2009-06-30 09:00:00')
使用偏移量 Series / DatetimeIndex
偏移可與被用在Series或DatetimeIndex施加的偏移量的每個(gè)元素。

In [142]: rng = pd.date_range('2012-01-01', '2012-01-03')
?
In [143]: s = pd.Series(rng)
?
In [144]: rng
Out[144]: DatetimeIndex(['2012-01-01', '2012-01-02', '2012-01-03'], dtype='datetime64[ns]', freq='D')
?
In [145]: rng + DateOffset(months=2)
Out[145]: DatetimeIndex(['2012-03-01', '2012-03-02', '2012-03-03'], dtype='datetime64[ns]', freq='D')
?
In [146]: s + DateOffset(months=2)
Out[146]:?
0 ? 2012-03-01
1 ? 2012-03-02
2 ? 2012-03-03
dtype: datetime64[ns]
?
In [147]: s - DateOffset(months=2)
Out[147]:?
0 ? 2011-11-01
1 ? 2011-11-02
2 ? 2011-11-03
dtype: datetime64[ns]

如果偏移類直接映射到一個(gè)Timedelta(Day,Hour, Minute,Second,Micro,Milli,Nano),它可以被精確地用于像Timedelta-參見 Timedelta部更多的例子。

In [148]: s - Day(2)
Out[148]:?
0 ? 2011-12-30
1 ? 2011-12-31
2 ? 2012-01-01
dtype: datetime64[ns]
?
In [149]: td = s - pd.Series(pd.date_range('2011-12-29', '2011-12-31'))
?
In [150]: td
Out[150]:?
0 ? 3 days
1 ? 3 days
2 ? 3 days
dtype: timedelta64[ns]
?
In [151]: td + Minute(15)
Out[151]:?
0 ? 3 days 00:15:00
1 ? 3 days 00:15:00
2 ? 3 days 00:15:00
dtype: timedelta64[ns]

請(qǐng)注意,某些偏移(例如BQuarterEnd)沒有矢量化實(shí)現(xiàn)。他們?nèi)匀豢梢允褂?,但可能?huì)計(jì)算得更慢,并將顯示PerformanceWarning

In [152]: rng + BQuarterEnd()
Out[152]: DatetimeIndex(['2012-03-30', '2012-03-30', '2012-03-30'], dtype='datetime64[ns]', freq='D')
?

定制營(yíng)業(yè)日
本CDay或CustomBusinessDay類提供的參數(shù) BusinessDay可用于創(chuàng)建定制的工作日日歷占當(dāng)?shù)氐墓?jié)假日和周末地方慣例類。

作為一個(gè)有趣的例子,讓我們看一下觀察周五周六周末的埃及。

In [153]: from pandas.tseries.offsets import CustomBusinessDay
?
In [154]: weekmask_egypt = 'Sun Mon Tue Wed Thu'
?
# 他們也觀察國(guó)際勞工節(jié)所以讓我們
# 加一年
In [155]: holidays = ['2012-05-01', datetime(2013, 5, 1), np.datetime64('2014-05-01')]
?
In [156]: bday_egypt = CustomBusinessDay(holidays=holidays, weekmask=weekmask_egypt)
?
In [157]: dt = datetime(2013, 4, 30)
?
In [158]: dt + 2 * bday_egypt
Out[158]: Timestamp('2013-05-05 00:00:00')
讓我們映射到工作日名稱:

In [159]: dts = pd.date_range(dt, periods=5, freq=bday_egypt)
?
In [160]: pd.Series(dts.weekday, dts).map(pd.Series('Mon Tue Wed Thu Fri Sat Sun'.split()))
Out[160]:?
2013-04-30 ? ?Tue
2013-05-02 ? ?Thu
2013-05-05 ? ?Sun
2013-05-06 ? ?Mon
2013-05-07 ? ?Tue
Freq: C, dtype: object
假日日歷可用于提供假期列表。有關(guān)詳細(xì)信息,請(qǐng)參閱 假日日歷部分。

In [161]: from pandas.tseries.holiday import USFederalHolidayCalendar
?
In [162]: bday_us = CustomBusinessDay(calendar=USFederalHolidayCalendar())
?
# 星期五之前的星期五
In [163]: dt = datetime(2014, 1, 17)
?
# 星期二之后的星期二(星期一被跳過,因?yàn)檫@是一個(gè)假期)
In [164]: dt + bday_us
Out[164]: Timestamp('2014-01-21 00:00:00')
可以通常的方式定義尊重特定假日日歷的每月偏移量。

In [165]: from pandas.tseries.offsets import CustomBusinessMonthBegin
?
In [166]: bmth_us = CustomBusinessMonthBegin(calendar=USFederalHolidayCalendar())
?
# 跳過新年
In [167]: dt = datetime(2013, 12, 17)
?
In [168]: dt + bmth_us
Out[168]: Timestamp('2014-01-02 00:00:00')
?
# 用自定義偏移定義日期索引
In [169]: pd.DatetimeIndex(start='20100101',end='20120101',freq=bmth_us)
Out[169]:?
DatetimeIndex(['2010-01-04', '2010-02-01', '2010-03-01', '2010-04-01',
? ? ? ? ? ? ? ?'2010-05-03', '2010-06-01', '2010-07-01', '2010-08-02',
? ? ? ? ? ? ? ?'2010-09-01', '2010-10-01', '2010-11-01', '2010-12-01',
? ? ? ? ? ? ? ?'2011-01-03', '2011-02-01', '2011-03-01', '2011-04-01',
? ? ? ? ? ? ? ?'2011-05-02', '2011-06-01', '2011-07-01', '2011-08-01',
? ? ? ? ? ? ? ?'2011-09-01', '2011-10-03', '2011-11-01', '2011-12-01'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='CBMS')

注意:頻率字符串“C”用于指示使用CustomBusinessDay DateOffset,請(qǐng)務(wù)必注意,由于CustomBusinessDay是參數(shù)化類型,因此CustomBusinessDay的實(shí)例可能不同,并且無(wú)法從“C”頻率字符串中檢測(cè)到。因此,用戶需要確保在用戶的應(yīng)用程序中始終使用“C”頻率字符串。

營(yíng)業(yè)時(shí)間
本BusinessHour類提供在營(yíng)業(yè)時(shí)間表示BusinessDay,允許使用特定的開始和結(jié)束時(shí)間。

默認(rèn)情況下,BusinessHour使用9:00 - 17:00作為營(yíng)業(yè)時(shí)間。添加BusinessHour將按Timestamp小時(shí)頻率遞增。如果目標(biāo)Timestamp停止?fàn)I業(yè)時(shí)間,請(qǐng)轉(zhuǎn)到下一個(gè)工作小時(shí),然后遞增。如果結(jié)果超過營(yíng)業(yè)時(shí)間結(jié)束,則剩余的小時(shí)數(shù)將添加到下一個(gè)工作日。

In [170]: bh = BusinessHour()
?
In [171]: bh
Out[171]: <BusinessHour: BH=09:00-17:00>
?
# 2014-08-01 is 星期五
In [172]: pd.Timestamp('2014-08-01 10:00').weekday()
Out[172]: 4
?
In [173]: pd.Timestamp('2014-08-01 10:00') + bh
Out[173]: Timestamp('2014-08-01 11:00:00')
?
# 下面的例子類似: pd.Timestamp('2014-08-01 09:00') + bh
In [174]: pd.Timestamp('2014-08-01 08:00') + bh
Out[174]: Timestamp('2014-08-01 10:00:00')
?
# 如果結(jié)果是在最后的時(shí)間,那么就轉(zhuǎn)到下一個(gè)工作日
In [175]: pd.Timestamp('2014-08-01 16:00') + bh
Out[175]: Timestamp('2014-08-04 09:00:00')
?
# 剩下的日子將在第二天添加
In [176]: pd.Timestamp('2014-08-01 16:30') + bh
Out[176]: Timestamp('2014-08-04 09:30:00')
?
# 增加2個(gè)營(yíng)業(yè)時(shí)間
In [177]: pd.Timestamp('2014-08-01 10:00') + BusinessHour(2)
Out[177]: Timestamp('2014-08-01 12:00:00')
?
# 減去3個(gè)營(yíng)業(yè)時(shí)間
In [178]: pd.Timestamp('2014-08-01 10:00') + BusinessHour(-3)
Out[178]: Timestamp('2014-07-31 15:00:00')

您還可以按關(guān)鍵字指定start和end計(jì)時(shí)。參數(shù)必須是str帶有hour:minute表示或datetime.time 實(shí)例的參數(shù)。指定秒,微秒和納秒作為營(yíng)業(yè)時(shí)間的結(jié)果ValueError。

In [179]: bh = BusinessHour(start='11:00', end=time(20, 0))
?
In [180]: bh
Out[180]: <BusinessHour: BH=11:00-20:00>
?
In [181]: pd.Timestamp('2014-08-01 13:00') + bh
Out[181]: Timestamp('2014-08-01 14:00:00')
?
In [182]: pd.Timestamp('2014-08-01 09:00') + bh
Out[182]: Timestamp('2014-08-01 12:00:00')
?
In [183]: pd.Timestamp('2014-08-01 18:00') + bh
Out[183]: Timestamp('2014-08-01 19:00:00')
通過start時(shí)間晚于end代表午夜?fàn)I業(yè)時(shí)間。在這種情況下,營(yíng)業(yè)時(shí)間超過午夜并重疊到第二天。有效營(yíng)業(yè)時(shí)間的區(qū)別在于它是否從有效開始BusinessDay。

In [184]: bh = BusinessHour(start='17:00', end='09:00')
?
In [185]: bh
Out[185]: <BusinessHour: BH=17:00-09:00>
?
In [186]: pd.Timestamp('2014-08-01 17:00') + bh
Out[186]: Timestamp('2014-08-01 18:00:00')
?
In [187]: pd.Timestamp('2014-08-01 23:00') + bh
Out[187]: Timestamp('2014-08-02 00:00:00')
?
# 盡管2014-08-02是satu年份,
# 它是有效的,因?yàn)樗鼜?8-01(星期五)開始。
In [188]: pd.Timestamp('2014-08-02 04:00') + bh
Out[188]: Timestamp('2014-08-02 05:00:00')
?
# 盡管2014-08-04是星期一,
# 因?yàn)樗鼜?8-03(星期日)開始,所以它已經(jīng)不在營(yíng)業(yè)時(shí)間了。
In [189]: pd.Timestamp('2014-08-04 04:00') + bh
Out[189]: Timestamp('2014-08-04 18:00:00')

申請(qǐng)BusinessHour.rollforward和rollback營(yíng)業(yè)時(shí)間將導(dǎo)致下一個(gè)營(yíng)業(yè)時(shí)間開始或前一天結(jié)束。與其他偏移BusinessHour.rollforward 不同,可以apply根據(jù)定義輸出不同的結(jié)果。

這是因?yàn)橐惶斓臓I(yíng)業(yè)時(shí)間結(jié)束等于第二天的營(yíng)業(yè)時(shí)間開始。例如,在默認(rèn)營(yíng)業(yè)時(shí)間(9:00 - 17:00)下,和 之間沒有間隙(0分鐘)。2014-08-01 17:002014-08-04 09:00

# 這會(huì)將時(shí)間戳調(diào)整到業(yè)務(wù)小時(shí)邊緣
In [190]: BusinessHour().rollback(pd.Timestamp('2014-08-02 15:00'))
Out[190]: Timestamp('2014-08-01 17:00:00')
?
In [191]: BusinessHour().rollforward(pd.Timestamp('2014-08-02 15:00'))
Out[191]: Timestamp('2014-08-04 09:00:00')
?
# 和 BusinessHour().apply(pd.Timestamp('2014-08-01 17:00'))一樣.
# And it is the same as BusinessHour().apply(pd.Timestamp('2014-08-04 09:00'))
In [192]: BusinessHour().apply(pd.Timestamp('2014-08-02 15:00'))
Out[192]: Timestamp('2014-08-04 10:00:00')
?
# 商業(yè)日結(jié)果(供參考)
In [193]: BusinessHour().rollforward(pd.Timestamp('2014-08-02'))
Out[193]: Timestamp('2014-08-04 09:00:00')
?
# 和 BusinessDay().apply(pd.Timestamp('2014-08-01')) 一樣
# The result is the same as rollworward because BusinessDay never overlap.
In [194]: BusinessHour().apply(pd.Timestamp('2014-08-02'))
Out[194]: Timestamp('2014-08-04 10:00:00')

BusinessHour將周六和周日視為假期。要使用任意假日,您可以使用CustomBusinessHour偏移量,如以下小節(jié)中所述。

自定義營(yíng)業(yè)時(shí)間
版本0.18.1中的新功能。

該CustomBusinessHour是的混合物BusinessHour,并CustomBusinessDay允許你指定任意假期。除了跳過指定的自定義假日外,其作用CustomBusinessHour相同BusinessHour。

In [195]: from pandas.tseries.holiday import USFederalHolidayCalendar
?
In [196]: bhour_us = CustomBusinessHour(calendar=USFederalHolidayCalendar())
?
# 星期五之前的星期五
In [197]: dt = datetime(2014, 1, 17, 15)
?
In [198]: dt + bhour_us
Out[198]: Timestamp('2014-01-17 16:00:00')
?
# 星期五,在MLK Day(星期一被跳過,因?yàn)檫@是假日)之后的星期五
In [199]: dt + bhour_us * 2
Out[199]: Timestamp('2014-01-21 09:00:00')
您可以使用BusinessHour和支持的關(guān)鍵字參數(shù)CustomBusinessDay。

In [200]: bhour_mon = CustomBusinessHour(start='10:00', weekmask='Tue Wed Thu Fri')
?
# 星期一被跳過,因?yàn)檫@是一個(gè)假期,營(yíng)業(yè)時(shí)間從10:00開始
In [201]: dt + bhour_mon * 2
Out[201]: Timestamp('2014-01-21 10:00:00')
?

偏移別名
許多字符串別名被賦予有用的公共時(shí)間序列頻率。我們將這些別名稱為偏移別名。

別號(hào)?? ?描述
B?? ?工作日頻率
C?? ?自定義工作日頻率
D?? ?日歷日頻率
W?? ?每周頻率
M?? ?月末頻率
SM?? ?半月結(jié)束頻率(15日和月末)
BM?? ?營(yíng)業(yè)月結(jié)束頻率
CBM?? ?自定義營(yíng)業(yè)月結(jié)束頻率
MS?? ?月開始頻率
SMS?? ?半月開始頻率(第1和第15)
BMS?? ?營(yíng)業(yè)月開始頻率
CBMS?? ?自定義營(yíng)業(yè)月開始頻率
Q?? ?四分之一結(jié)束頻率
BQ?? ?業(yè)務(wù)季度結(jié)束頻率
QS?? ?季度開始頻率
BQS?? ?業(yè)務(wù)季開始頻率
A,Y?? ?年終頻率
BA,BY?? ?業(yè)務(wù)年度結(jié)束頻率
AS,YS?? ?年開始頻率
BAS,BYS?? ?營(yíng)業(yè)年度開始頻率
BH?? ?營(yíng)業(yè)時(shí)間頻率
H?? ?每小時(shí)頻率
T,min?? ?微小的頻率
S?? ?其次是頻率
L,ms?? ?毫秒
U,us?? ?微秒
N?? ?納秒
?

組合別名
正如我們之前看到的,別名和偏移實(shí)例在大多數(shù)函數(shù)中都是可替換的:

In [202]: pd.date_range(start, periods=5, freq='B')
Out[202]:?
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
? ? ? ? ? ? ? ?'2011-01-07'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='B')
?
In [203]: pd.date_range(start, periods=5, freq=BDay())
Out[203]:?
DatetimeIndex(['2011-01-03', '2011-01-04', '2011-01-05', '2011-01-06',
? ? ? ? ? ? ? ?'2011-01-07'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='B')
您可以將日間和日內(nèi)偏移組合在一起:

In [204]: pd.date_range(start, periods=10, freq='2h20min')
Out[204]:?
DatetimeIndex(['2011-01-01 00:00:00', '2011-01-01 02:20:00',
? ? ? ? ? ? ? ?'2011-01-01 04:40:00', '2011-01-01 07:00:00',
? ? ? ? ? ? ? ?'2011-01-01 09:20:00', '2011-01-01 11:40:00',
? ? ? ? ? ? ? ?'2011-01-01 14:00:00', '2011-01-01 16:20:00',
? ? ? ? ? ? ? ?'2011-01-01 18:40:00', '2011-01-01 21:00:00'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='140T')
?
In [205]: pd.date_range(start, periods=10, freq='1D10U')
Out[205]:?
DatetimeIndex([ ? ? ? '2011-01-01 00:00:00', '2011-01-02 00:00:00.000010',
? ? ? ? ? ? ? ?'2011-01-03 00:00:00.000020', '2011-01-04 00:00:00.000030',
? ? ? ? ? ? ? ?'2011-01-05 00:00:00.000040', '2011-01-06 00:00:00.000050',
? ? ? ? ? ? ? ?'2011-01-07 00:00:00.000060', '2011-01-08 00:00:00.000070',
? ? ? ? ? ? ? ?'2011-01-09 00:00:00.000080', '2011-01-10 00:00:00.000090'],
? ? ? ? ? ? ? dtype='datetime64[ns]', freq='86400000010U')

錨定偏移
對(duì)于某些頻率,您可以指定錨定后綴:

別號(hào)?? ?描述
W-SUN?? ?每周頻率(星期日)。與'W'相同
W-MON?? ?每周頻率(星期一)
W-TUE?? ?每周頻率(星期二)
W-WED?? ?每周頻率(星期三)
W-THU?? ?每周頻率(星期四)
W-FRI?? ?每周頻率(星期五)
W-SAT?? ?每周頻率(星期六)
(B)Q(S)- DEC?? ?季度頻率,年份在12月結(jié)束。與'Q'相同
(B)Q(S)- JAN?? ?季度頻率,年份在1月結(jié)束
(B)Q(S)- FEB?? ?季度頻率,年份在2月結(jié)束
(B)Q(S)- MAR?? ?季度頻率,年份在3月結(jié)束
(B)Q(S)- APR?? ?季度頻率,年份在四月結(jié)束
(B)Q(S)- MAY?? ?季度頻率,年份在5月結(jié)束
(B)Q(S)- JUN?? ?季度頻率,年份在6月結(jié)束
(B)Q(S)- JUL?? ?季度頻率,年份在7月結(jié)束
(B)Q(S)- AUG?? ?季度頻率,年份在8月結(jié)束
(B)Q(S)- SEP?? ?季度頻率,年份在9月結(jié)束
(B)Q(S)- OCT?? ?季度頻率,年份在10月結(jié)束
(B)Q(S)- NOV?? ?季度頻率,年份在11月結(jié)束
(B)A(S)- DEC?? ?年度頻率,定于12月底。與'A'相同
(B)A(S)- JAN?? ?年度頻率,定于1月底
(B)A(S)- FEB?? ?年度頻率,定于2月底
(B)A(S)- MAR?? ?年度頻率,定于3月底
(B)A(S)- APR?? ?年度頻率,定于4月底
(B)A(S)- MAY?? ?年度頻率,錨定于5月底
(B)A(S)- JUN?? ?年度頻率,錨定于6月底
(B)A(S)- JUL?? ?年度頻率,定于7月底
(B)A(S)-AUG?? ?年度頻率,定于8月底
(B)A(S)- SEP?? ?年度頻率,定于9月底
(B)A(S)- OCT?? ?年度頻率,定于10月底
(B)A(S)- NOV?? ?年度頻率,定于11月底
這些可以被用作參數(shù)date_range,bdate_range,構(gòu)造函數(shù)DatetimeIndex,以及在大熊貓各種其它時(shí)間序列相關(guān)的功能。

錨定偏移語(yǔ)義
對(duì)于錨定到特定頻率的開始或結(jié)束這些偏移(MonthEnd,MonthBegin,WeekEnd等),下面的規(guī)則適用于向前滾動(dòng)和向后。

當(dāng)n不為0時(shí),如果給定日期不在錨點(diǎn)上,則它會(huì)捕捉到下一個(gè)(上一個(gè))錨點(diǎn),并|n|-1向前或向后移動(dòng)其他步驟。

In [206]: pd.Timestamp('2014-01-02') + MonthBegin(n=1)
Out[206]: Timestamp('2014-02-01 00:00:00')
?
In [207]: pd.Timestamp('2014-01-02') + MonthEnd(n=1)
Out[207]: Timestamp('2014-01-31 00:00:00')
?
In [208]: pd.Timestamp('2014-01-02') - MonthBegin(n=1)
Out[208]: Timestamp('2014-01-01 00:00:00')
?
In [209]: pd.Timestamp('2014-01-02') - MonthEnd(n=1)
Out[209]: Timestamp('2013-12-31 00:00:00')
?
In [210]: pd.Timestamp('2014-01-02') + MonthBegin(n=4)
Out[210]: Timestamp('2014-05-01 00:00:00')
?
In [211]: pd.Timestamp('2014-01-02') - MonthBegin(n=4)
Out[211]: Timestamp('2013-10-01 00:00:00')

如果給定的日期是上一個(gè)錨點(diǎn),它被移動(dòng)|n|向前或向后點(diǎn)。

In [212]: pd.Timestamp('2014-01-01') + MonthBegin(n=1)
Out[212]: Timestamp('2014-02-01 00:00:00')
?
In [213]: pd.Timestamp('2014-01-31') + MonthEnd(n=1)
Out[213]: Timestamp('2014-02-28 00:00:00')
?
In [214]: pd.Timestamp('2014-01-01') - MonthBegin(n=1)
Out[214]: Timestamp('2013-12-01 00:00:00')
?
In [215]: pd.Timestamp('2014-01-31') - MonthEnd(n=1)
Out[215]: Timestamp('2013-12-31 00:00:00')
?
In [216]: pd.Timestamp('2014-01-01') + MonthBegin(n=4)
Out[216]: Timestamp('2014-05-01 00:00:00')
?
In [217]: pd.Timestamp('2014-01-31') - MonthBegin(n=4)
Out[217]: Timestamp('2013-10-01 00:00:00')

對(duì)于這種情況n=0,如果在錨點(diǎn)上沒有移動(dòng)日期,否則它將前滾到下一個(gè)錨點(diǎn)。

In [218]: pd.Timestamp('2014-01-02') + MonthBegin(n=0)
Out[218]: Timestamp('2014-02-01 00:00:00')
?
In [219]: pd.Timestamp('2014-01-02') + MonthEnd(n=0)
Out[219]: Timestamp('2014-01-31 00:00:00')
?
In [220]: pd.Timestamp('2014-01-01') + MonthBegin(n=0)
Out[220]: Timestamp('2014-01-01 00:00:00')
?
In [221]: pd.Timestamp('2014-01-31') + MonthEnd(n=0)
Out[221]: Timestamp('2014-01-31 00:00:00')
假期/假日日歷
假日和日歷提供了一種簡(jiǎn)單的方法來定義要使用的假日規(guī)則,CustomBusinessDay或者在需要預(yù)定義假日集的其他分析中。本AbstractHolidayCalendar類提供了所有必要的方法返回節(jié)假日列表,只rules需要在一個(gè)特定的假期日歷類中定義。此外,start_date和end_date 屬性確定生成假日的日期范圍。這些應(yīng)該在AbstractHolidayCalendar類上被覆蓋,以使范圍適用于所有日歷子類。 USFederalHolidayCalendar是唯一存在的日歷,主要用作開發(fā)其他日歷的示例。

對(duì)于在固定日期(例如,美國(guó)陣亡將士紀(jì)念日或7月4日)發(fā)生的假期,遵守規(guī)則確定何時(shí)觀察該假期是否屬于周末或其他非觀察日。規(guī)定的遵守規(guī)則是:

規(guī)則?? ?描述
nearest_workday?? ?周六到周五,周日到周一
sunday_to_monday?? ?星期天到星期一
next_monday_or_tuesday?? ?周六到周一和周日/周一到周二
previous_friday?? ?星期六和星期日到上周五“
下個(gè)星期一?? ?星期六和星期日到星期一
定義假日和假日日歷的示例:

In [222]: from pandas.tseries.holiday import Holiday, USMemorialDay,\
? ?.....: ? ? AbstractHolidayCalendar, nearest_workday, MO
? ?.....:?
?
In [223]: class ExampleCalendar(AbstractHolidayCalendar):
? ?.....: ? ? rules = [
? ?.....: ? ? ? ? USMemorialDay,
? ?.....: ? ? ? ? Holiday('July 4th', month=7, day=4, observance=nearest_workday),
? ?.....: ? ? ? ? Holiday('Columbus Day', month=10, day=1,
? ?.....: ? ? ? ? ? ? offset=DateOffset(weekday=MO(2))), #same as 2*Week(weekday=2)
? ?.....: ? ? ? ? ]
? ?.....:?
?
In [224]: cal = ExampleCalendar()
?
In [225]: cal.holidays(datetime(2012, 1, 1), datetime(2012, 12, 31))
Out[225]: DatetimeIndex(['2012-05-28', '2012-07-04', '2012-10-08'], dtype='datetime64[ns]', freq=None)

使用此日歷,創(chuàng)建索引或執(zhí)行偏移算術(shù)會(huì)跳過周末和假日(即陣亡將士紀(jì)念日/ 7月4日)。例如,下面使用的定義了自定義工作日偏移量ExampleCalendar。與任何其他偏移一樣,它可用于創(chuàng)建DatetimeIndex或添加datetime 或Timestamp對(duì)象。

In [226]: from pandas.tseries.offsets import CDay
?
In [227]: pd.DatetimeIndex(start='7/1/2012', end='7/10/2012',
? ?.....: ? ? freq=CDay(calendar=cal)).to_pydatetime()
? ?.....:?
Out[227]:?
array([datetime.datetime(2012, 7, 2, 0, 0),
? ? ? ?datetime.datetime(2012, 7, 3, 0, 0),
? ? ? ?datetime.datetime(2012, 7, 5, 0, 0),
? ? ? ?datetime.datetime(2012, 7, 6, 0, 0),
? ? ? ?datetime.datetime(2012, 7, 9, 0, 0),
? ? ? ?datetime.datetime(2012, 7, 10, 0, 0)], dtype=object)
?
In [228]: offset = CustomBusinessDay(calendar=cal)
?
In [229]: datetime(2012, 5, 25) + offset
Out[229]: Timestamp('2012-05-29 00:00:00')
?
In [230]: datetime(2012, 7, 3) + offset
Out[230]: Timestamp('2012-07-05 00:00:00')
?
In [231]: datetime(2012, 7, 3) + 2 * offset
Out[231]: Timestamp('2012-07-06 00:00:00')
?
In [232]: datetime(2012, 7, 6) + offset
Out[232]: Timestamp('2012-07-09 00:00:00')

范圍由start_date和的end_date類屬性定義AbstractHolidayCalendar。默認(rèn)值如下所示。

In [233]: AbstractHolidayCalendar.start_date
Out[233]: Timestamp('1970-01-01 00:00:00')
?
In [234]: AbstractHolidayCalendar.end_date
Out[234]: Timestamp('2030-12-31 00:00:00')
通過將屬性設(shè)置為datetime / Timestamp / string,可以覆蓋這些日期。

In [235]: AbstractHolidayCalendar.start_date = datetime(2012, 1, 1)
?
In [236]: AbstractHolidayCalendar.end_date = datetime(2012, 12, 31)
?
In [237]: cal.holidays()
Out[237]: DatetimeIndex(['2012-05-28', '2012-07-04', '2012-10-08'], dtype='datetime64[ns]', freq=None)
每個(gè)日歷類都可以使用get_calendar返回假日類實(shí)例的函數(shù)按名稱訪問。此功能將自動(dòng)提供任何導(dǎo)入的日歷類。此外,HolidayCalendarFactory 還提供了一個(gè)簡(jiǎn)單的界面來創(chuàng)建日歷,這些日歷是日歷或日歷與其他規(guī)則的組合。

In [238]: from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory,\
? ?.....: ? ? USLaborDay
? ?.....:?
?
In [239]: cal = get_calendar('ExampleCalendar')
?
In [240]: cal.rules
Out[240]:?
[Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
?Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f20d5b40f28>),
?Holiday: Columbus Day (month=10, day=1, offset=<DateOffset: weekday=MO(+2)>)]
?
In [241]: new_cal = HolidayCalendarFactory('NewExampleCalendar', cal, USLaborDay)
?
In [242]: new_cal.rules
Out[242]:?
[Holiday: Labor Day (month=9, day=1, offset=<DateOffset: weekday=MO(+1)>),
?Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: weekday=MO(-1)>),
?Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x7f20d5b40f28>),
?Holiday: Columbus Day (month=10, day=1, offset=<DateOffset: weekday=MO(+2)>)]

時(shí)間序列相關(guān)實(shí)例方法
移位/滯后
人們可能希望在時(shí)間序列中及時(shí)地向前或向后移動(dòng)或滯后。用于此的方法shift()是在所有pandas對(duì)象上可用的。

In [243]: ts = ts[:5]
?
In [244]: ts.shift(1)
Out[244]:?
2011-01-31 ? ? ? ? NaN
2011-02-28 ? -1.281247
2011-03-31 ? -0.727707
2011-04-29 ? -0.121306
2011-05-31 ? -0.097883
Freq: BM, dtype: float64
該shift方法接受一個(gè)freq參數(shù),該參數(shù)可以接受DateOffset類或其他類似timedelta的對(duì)象,也 可以接受 偏移別名:

In [245]: ts.shift(5, freq=offsets.BDay())
Out[245]:?
2011-02-07 ? -1.281247
2011-03-07 ? -0.727707
2011-04-07 ? -0.121306
2011-05-06 ? -0.097883
2011-06-07 ? ?0.695775
dtype: float64
?
In [246]: ts.shift(5, freq='BM')
Out[246]:?
2011-06-30 ? -1.281247
2011-07-29 ? -0.727707
2011-08-31 ? -0.121306
2011-09-30 ? -0.097883
2011-10-31 ? ?0.695775
Freq: BM, dtype: float64

而不是改變數(shù)據(jù)和索引,的取向DataFrame和 Series對(duì)象也有一個(gè)tshift()由偏移指定數(shù)目的改變了索引的所有日期的便利方法:

In [247]: ts.tshift(5, freq='D')
Out[247]:?
2011-02-05 ? -1.281247
2011-03-05 ? -0.727707
2011-04-05 ? -0.121306
2011-05-04 ? -0.097883
2011-06-05 ? ?0.695775
dtype: float64
請(qǐng)注意,tshift由于數(shù)據(jù)未重新排列,因此前導(dǎo)條目不再是NaN。

頻率轉(zhuǎn)換
改變頻率的主要功能是asfreq() 方法。對(duì)于a DatetimeIndex,這基本上只是一個(gè)很薄但很方便的包裝器,reindex() 可以生成一個(gè)date_range和調(diào)用reindex。

In [248]: dr = pd.date_range('1/1/2010', periods=3, freq=3 * offsets.BDay())
?
In [249]: ts = pd.Series(randn(3), index=dr)
?
In [250]: ts
Out[250]:?
2010-01-01 ? ?0.155932
2010-01-06 ? ?1.486218
2010-01-11 ? -2.148675
Freq: 3B, dtype: float64
?
In [251]: ts.asfreq(BDay())
Out[251]:?
2010-01-01 ? ?0.155932
2010-01-04 ? ? ? ? NaN
2010-01-05 ? ? ? ? NaN
2010-01-06 ? ?1.486218
2010-01-07 ? ? ? ? NaN
2010-01-08 ? ? ? ? NaN
2010-01-11 ? -2.148675
Freq: B, dtype: float64

asfreq 提供了更多便利,因此您可以為頻率轉(zhuǎn)換后可能出現(xiàn)的任何間隙指定插值方法。

In [252]: ts.asfreq(BDay(), method='pad')
Out[252]:?
2010-01-01 ? ?0.155932
2010-01-04 ? ?0.155932
2010-01-05 ? ?0.155932
2010-01-06 ? ?1.486218
2010-01-07 ? ?1.486218
2010-01-08 ? ?1.486218
2010-01-11 ? -2.148675
Freq: B, dtype: float64
向前/向后填充
與缺失數(shù)據(jù)部分中記錄的相關(guān)asfreq和reindex是。fillna()

轉(zhuǎn)換為Python日期時(shí)間
DatetimeIndex可以datetime.datetime使用該to_pydatetime方法將其轉(zhuǎn)換為Python本機(jī)對(duì)象的數(shù)組 。

重新采樣
警告:接口.resample已在0.18.0中更改為更像groupby,因此更靈活。有關(guān)與先前版本的比較,請(qǐng)參閱whatsnew文檔。

Pandas具有簡(jiǎn)單,強(qiáng)大且高效的功能,用于在頻率轉(zhuǎn)換期間執(zhí)行重采樣操作(例如,將第二數(shù)據(jù)轉(zhuǎn)換為5分鐘數(shù)據(jù))。這在財(cái)務(wù)應(yīng)用程序中非常常見,但不僅限于此。

resample()是一個(gè)基于時(shí)間的groupby,然后是每個(gè)組的縮減方法。查看一些高級(jí)策略的烹飪書示例。

從版本0.18.1開始,該resample()函數(shù)可以直接在 DataFrameGroupBy對(duì)象中使用,請(qǐng)參閱groupby文檔。

注意: .resample()類似于使用rolling()具有基于時(shí)間的偏移的操作,請(qǐng)參閱此處的討論。

基礎(chǔ)知識(shí)
In [253]: rng = pd.date_range('1/1/2012', periods=100, freq='S')
?
In [254]: ts = pd.Series(np.random.randint(0, 500, len(rng)), index=rng)
?
In [255]: ts.resample('5Min').sum()
Out[255]:?
2012-01-01 ? ?25653
Freq: 5T, dtype: int64
該resample功能非常靈活,允許您指定許多不同的參數(shù)來控制頻率轉(zhuǎn)換和重采樣操作。

任何經(jīng)由可用的功能調(diào)度可作為返回的對(duì)象的方法,包括sum,mean,std,sem, max,min,median,first,last,ohlc:

In [256]: ts.resample('5Min').mean()
Out[256]:?
2012-01-01 ? ?256.53
Freq: 5T, dtype: float64
?
In [257]: ts.resample('5Min').ohlc()
Out[257]:?
? ? ? ? ? ? open ?high ?low ?close
2012-01-01 ? 296 ? 496 ? ?6 ? ?449
?
In [258]: ts.resample('5Min').max()
Out[258]:?
2012-01-01 ? ?496
Freq: 5T, dtype: int64
對(duì)于下采樣,closed可以設(shè)置為“左”或“右”以指定間隔的哪一端關(guān)閉:

In [259]: ts.resample('5Min', closed='right').mean()
Out[259]:?
2011-12-31 23:55:00 ? ?296.000000
2012-01-01 00:00:00 ? ?256.131313
Freq: 5T, dtype: float64
?
In [260]: ts.resample('5Min', closed='left').mean()
Out[260]:?
2012-01-01 ? ?256.53
Freq: 5T, dtype: float64
參數(shù)like label和loffset用于處理結(jié)果標(biāo)簽。label指定結(jié)果是使用間隔的開頭還是結(jié)尾標(biāo)記。loffset對(duì)輸出標(biāo)簽執(zhí)行時(shí)間調(diào)整。

In [261]: ts.resample('5Min').mean() # by default label='left'
Out[261]:?
2012-01-01 ? ?256.53
Freq: 5T, dtype: float64
?
In [262]: ts.resample('5Min', label='left').mean()
Out[262]:?
2012-01-01 ? ?256.53
Freq: 5T, dtype: float64
?
In [263]: ts.resample('5Min', label='left', loffset='1s').mean()
Out[263]:?
2012-01-01 00:00:01 ? ?256.53
dtype: float64
注意:的缺省值label和closed被“左”為除了“M”,“A”,“Q”,“BM”,“BA”,“BQ”,和“W”的所有頻率偏移,所有具有“默認(rèn)對(duì)'。

In [264]: rng2 = pd.date_range('1/1/2012', end='3/31/2012', freq='D')
?
In [265]: ts2 = pd.Series(range(len(rng2)), index=rng2)
?
# default: label='right', closed='right'
In [266]: ts2.resample('M').max()
Out[266]:?
2012-01-31 ? ?30
2012-02-29 ? ?59
2012-03-31 ? ?90
Freq: M, dtype: int64
?
# default: label='left', closed='left'
In [267]: ts2.resample('SM').max()
Out[267]:?
2011-12-31 ? ?13
2012-01-15 ? ?29
2012-01-31 ? ?44
2012-02-15 ? ?58
2012-02-29 ? ?73
2012-03-15 ? ?89
2012-03-31 ? ?90
Freq: SM-15, dtype: int64
?
In [268]: ts2.resample('SM', label='right', closed='right').max()
Out[268]:?
2012-01-15 ? ?14.0
2012-01-31 ? ?30.0
2012-02-15 ? ?45.0
2012-02-29 ? ?59.0
2012-03-15 ? ?74.0
2012-03-31 ? ?90.0
2012-04-15 ? ? NaN
Freq: SM-15, dtype: float64

該axis參數(shù)可以設(shè)置為0或1,并允許您重新采樣a的指定軸DataFrame。

kind可以設(shè)置為'timestamp'或'period',以將結(jié)果索引轉(zhuǎn)換為/從時(shí)間戳和時(shí)間跨度表示。默認(rèn)情況下,resample 保留輸入表示。

convention重新采樣周期數(shù)據(jù)時(shí)可以設(shè)置為“開始”或“結(jié)束”(詳情如下)。它指定低頻周期如何轉(zhuǎn)換為更高頻率周期。

上采樣
對(duì)于上采樣,您可以指定上采樣的方法,并在limit創(chuàng)建的間隙上插入?yún)?shù):

# from secondly to every 250 milliseconds
In [269]: ts[:2].resample('250L').asfreq()
Out[269]:?
2012-01-01 00:00:00.000 ? ?296.0
2012-01-01 00:00:00.250 ? ? ?NaN
2012-01-01 00:00:00.500 ? ? ?NaN
2012-01-01 00:00:00.750 ? ? ?NaN
2012-01-01 00:00:01.000 ? ?199.0
Freq: 250L, dtype: float64
?
In [270]: ts[:2].resample('250L').ffill()
Out[270]:?
2012-01-01 00:00:00.000 ? ?296
2012-01-01 00:00:00.250 ? ?296
2012-01-01 00:00:00.500 ? ?296
2012-01-01 00:00:00.750 ? ?296
2012-01-01 00:00:01.000 ? ?199
Freq: 250L, dtype: int64
?
In [271]: ts[:2].resample('250L').ffill(limit=2)
Out[271]:?
2012-01-01 00:00:00.000 ? ?296.0
2012-01-01 00:00:00.250 ? ?296.0
2012-01-01 00:00:00.500 ? ?296.0
2012-01-01 00:00:00.750 ? ? ?NaN
2012-01-01 00:00:01.000 ? ?199.0
Freq: 250L, dtype: float64

稀疏重采樣
稀疏時(shí)間序列相對(duì)于您要重新采樣的時(shí)間量而言,您的點(diǎn)數(shù)要少得多。天真地對(duì)稀疏序列進(jìn)行上采樣可能會(huì)產(chǎn)生大量中間值。當(dāng)你不希望使用一種方法來填補(bǔ)這些值,如fill_methodIS None,然后中間值將被充滿NaN。

由于resample是基于時(shí)間的groupby,以下是僅有效地重新采樣不是全部的組的方法NaN。

In [272]: rng = pd.date_range('2014-1-1', periods=100, freq='D') + pd.Timedelta('1s')
?
In [273]: ts = pd.Series(range(100), index=rng)
如果我們想重新采樣到系列的全部范圍:

In [274]: ts.resample('3T').sum()
Out[274]:?
2014-01-01 00:00:00 ? ? 0
2014-01-01 00:03:00 ? ? 0
2014-01-01 00:06:00 ? ? 0
2014-01-01 00:09:00 ? ? 0
2014-01-01 00:12:00 ? ? 0
2014-01-01 00:15:00 ? ? 0
2014-01-01 00:18:00 ? ? 0
? ? ? ? ? ? ? ? ? ? ? ?..
2014-04-09 23:42:00 ? ? 0
2014-04-09 23:45:00 ? ? 0
2014-04-09 23:48:00 ? ? 0
2014-04-09 23:51:00 ? ? 0
2014-04-09 23:54:00 ? ? 0
2014-04-09 23:57:00 ? ? 0
2014-04-10 00:00:00 ? ?99
Freq: 3T, Length: 47521, dtype: int64

我們只能重新采樣那些我們有積分的群組,如下所示:

In [275]: from functools import partial
?
In [276]: from pandas.tseries.frequencies import to_offset
?
In [277]: def round(t, freq):
? ?.....: ? ? freq = to_offset(freq)
? ?.....: ? ? return pd.Timestamp((t.value // freq.delta.value) * freq.delta.value)
? ?.....:?
?
In [278]: ts.groupby(partial(round, freq='3T')).sum()
Out[278]:?
2014-01-01 ? ? 0
2014-01-02 ? ? 1
2014-01-03 ? ? 2
2014-01-04 ? ? 3
2014-01-05 ? ? 4
2014-01-06 ? ? 5
2014-01-07 ? ? 6
? ? ? ? ? ? ? ..
2014-04-04 ? ?93
2014-04-05 ? ?94
2014-04-06 ? ?95
2014-04-07 ? ?96
2014-04-08 ? ?97
2014-04-09 ? ?98
2014-04-10 ? ?99
Length: 100, dtype: int64

聚合
與聚合API,groupby API和窗口函數(shù)API類似,Resampler可以選擇性地重新采樣a。

重新采樣a DataFrame,默認(rèn)情況下將對(duì)具有相同功能的所有列執(zhí)行操作。

In [279]: df = pd.DataFrame(np.random.randn(1000, 3),
? ?.....: ? ? ? ? ? ? ? ? ? index=pd.date_range('1/1/2012', freq='S', periods=1000),
? ?.....: ? ? ? ? ? ? ? ? ? columns=['A', 'B', 'C'])
? ?.....:?
?
In [280]: r = df.resample('3T')
?
In [281]: r.mean()
Out[281]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A ? ? ? ? B ? ? ? ? C
2012-01-01 00:00:00 -0.038580 -0.085117 -0.024750
2012-01-01 00:03:00 ?0.052387 -0.061477 ?0.029548
2012-01-01 00:06:00 ?0.121377 -0.010630 -0.043691
2012-01-01 00:09:00 -0.106814 -0.053819 ?0.097222
2012-01-01 00:12:00 ?0.032560 ?0.080543 ?0.167380
2012-01-01 00:15:00 ?0.060486 -0.057602 -0.106213

我們可以使用標(biāo)準(zhǔn)getitem選擇一個(gè)或多個(gè)特定列。

In [282]: r['A'].mean()
Out[282]:?
2012-01-01 00:00:00 ? -0.038580
2012-01-01 00:03:00 ? ?0.052387
2012-01-01 00:06:00 ? ?0.121377
2012-01-01 00:09:00 ? -0.106814
2012-01-01 00:12:00 ? ?0.032560
2012-01-01 00:15:00 ? ?0.060486
Freq: 3T, Name: A, dtype: float64
?
In [283]: r[['A','B']].mean()
Out[283]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? A ? ? ? ? B
2012-01-01 00:00:00 -0.038580 -0.085117
2012-01-01 00:03:00 ?0.052387 -0.061477
2012-01-01 00:06:00 ?0.121377 -0.010630
2012-01-01 00:09:00 -0.106814 -0.053819
2012-01-01 00:12:00 ?0.032560 ?0.080543
2012-01-01 00:15:00 ?0.060486 -0.057602

您可以傳遞函數(shù)的列表或字典來進(jìn)行聚合,輸出DataFrame:

In [284]: r['A'].agg([np.sum, np.mean, np.std])
Out[284]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ?sum ? ? ?mean ? ? ? std
2012-01-01 00:00:00 ?-6.944481 -0.038580 ?0.985150
2012-01-01 00:03:00 ? 9.429707 ?0.052387 ?1.078022
2012-01-01 00:06:00 ?21.847876 ?0.121377 ?0.996365
2012-01-01 00:09:00 -19.226593 -0.106814 ?0.914070
2012-01-01 00:12:00 ? 5.860874 ?0.032560 ?1.100055
2012-01-01 00:15:00 ? 6.048588 ?0.060486 ?1.001532
在重新采樣時(shí)DataFrame,您可以傳遞要應(yīng)用于每個(gè)列的函數(shù)列表,從而生成具有分層索引的聚合結(jié)果:

In [285]: r.agg([np.sum, np.mean])
Out[285]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?A ? ? ? ? ? ? ? ? ? ?B ? ? ? ? ? ? ? ? ? ?C ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ?sum ? ? ?mean ? ? ? ?sum ? ? ?mean ? ? ? ?sum ? ? ?mean
2012-01-01 00:00:00 ?-6.944481 -0.038580 -15.320993 -0.085117 ?-4.454941 -0.024750
2012-01-01 00:03:00 ? 9.429707 ?0.052387 -11.065916 -0.061477 ? 5.318688 ?0.029548
2012-01-01 00:06:00 ?21.847876 ?0.121377 ?-1.913420 -0.010630 ?-7.864429 -0.043691
2012-01-01 00:09:00 -19.226593 -0.106814 ?-9.687468 -0.053819 ?17.499920 ?0.097222
2012-01-01 00:12:00 ? 5.860874 ?0.032560 ?14.497725 ?0.080543 ?30.128432 ?0.167380
2012-01-01 00:15:00 ? 6.048588 ?0.060486 ?-5.760208 -0.057602 -10.621260 -0.106213
通過將dict傳遞給aggregate您可以將不同的聚合應(yīng)用于以下列DataFrame:

In [286]: r.agg({'A' : np.sum,
? ?.....: ? ? ? ?'B' : lambda x: np.std(x, ddof=1)})
? ?.....:?
Out[286]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?A ? ? ? ? B
2012-01-01 00:00:00 ?-6.944481 ?1.087752
2012-01-01 00:03:00 ? 9.429707 ?1.014552
2012-01-01 00:06:00 ?21.847876 ?0.954588
2012-01-01 00:09:00 -19.226593 ?1.027990
2012-01-01 00:12:00 ? 5.860874 ?1.021503
2012-01-01 00:15:00 ? 6.048588 ?1.004984
函數(shù)名稱也可以是字符串。為了使字符串有效,必須在重新采樣的對(duì)象上實(shí)現(xiàn):

In [287]: r.agg({'A' : 'sum', 'B' : 'std'})
Out[287]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?A ? ? ? ? B
2012-01-01 00:00:00 ?-6.944481 ?1.087752
2012-01-01 00:03:00 ? 9.429707 ?1.014552
2012-01-01 00:06:00 ?21.847876 ?0.954588
2012-01-01 00:09:00 -19.226593 ?1.027990
2012-01-01 00:12:00 ? 5.860874 ?1.021503
2012-01-01 00:15:00 ? 6.048588 ?1.004984
此外,您還可以分別為每列指定多個(gè)聚合函數(shù)。

In [288]: r.agg({'A' : ['sum','std'], 'B' : ['mean','std'] })
Out[288]:?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?A ? ? ? ? ? ? ? ? ? B ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ?sum ? ? ? std ? ? ?mean ? ? ? std
2012-01-01 00:00:00 ?-6.944481 ?0.985150 -0.085117 ?1.087752
2012-01-01 00:03:00 ? 9.429707 ?1.078022 -0.061477 ?1.014552
2012-01-01 00:06:00 ?21.847876 ?0.996365 -0.010630 ?0.954588
2012-01-01 00:09:00 -19.226593 ?0.914070 -0.053819 ?1.027990
2012-01-01 00:12:00 ? 5.860874 ?1.100055 ?0.080543 ?1.021503
2012-01-01 00:15:00 ? 6.048588 ?1.001532 -0.057602 ?1.004984
如果a DataFrame沒有datetimelike索引,而是想要根據(jù)框架中的datetimelike列重新取樣,則可以將其傳遞給 on關(guān)鍵字。

In [289]: df = pd.DataFrame({'date': pd.date_range('2015-01-01', freq='W', periods=5),
? ?.....: ? ? ? ? ? ? ? ? ? ?'a': np.arange(5)},
? ?.....: ? ? ? ? ? ? ? ? ? index=pd.MultiIndex.from_arrays([
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? ?[1,2,3,4,5],
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ? ? ?pd.date_range('2015-01-01', freq='W', periods=5)],
? ?.....: ? ? ? ? ? ? ? ? ? ? ? ?names=['v','d']))
? ?.....:?
?
In [290]: df
Out[290]:?
? ? ? ? ? ? ? ? ? ?date ?a
v d ? ? ? ? ? ? ? ? ? ? ??
1 2015-01-04 2015-01-04 ?0
2 2015-01-11 2015-01-11 ?1
3 2015-01-18 2015-01-18 ?2
4 2015-01-25 2015-01-25 ?3
5 2015-02-01 2015-02-01 ?4
?
In [291]: df.resample('M', on='date').sum()
Out[291]:?
? ? ? ? ? ? a
date ? ? ? ??
2015-01-31 ?6
2015-02-28 ?4

同樣,如果您希望按日期時(shí)間級(jí)別重新采樣,則MultiIndex可以將其名稱或位置傳遞給 level關(guān)鍵字。

In [292]: df.resample('M', level='d').sum()
Out[292]:?
? ? ? ? ? ? a
d ? ? ? ? ? ?
2015-01-31 ?6
2015-02-28 ?4
?

時(shí)間跨度表示
規(guī)則的時(shí)間間隔由Periodpandas中的Period對(duì)象表示,而對(duì)象序列在a中收集PeriodIndex,可以使用便利函數(shù)創(chuàng)建period_range。

周期(時(shí)間移動(dòng)步長(zhǎng))*
A Period表示時(shí)間跨度(例如,一天,一個(gè)月,四分之一等)。您可以freq使用下面的頻率別名通過關(guān)鍵字指定范圍。因?yàn)閒req代表一個(gè)跨度Period,它不能像“-3D”那樣是負(fù)面的。

In [293]: pd.Period('2012', freq='A-DEC')
Out[293]: Period('2012', 'A-DEC')
?
In [294]: pd.Period('2012-1-1', freq='D')
Out[294]: Period('2012-01-01', 'D')
?
In [295]: pd.Period('2012-1-1 19:00', freq='H')
Out[295]: Period('2012-01-01 19:00', 'H')
?
In [296]: pd.Period('2012-1-1 19:00', freq='5H')
Out[296]: Period('2012-01-01 19:00', '5H')
從周期中加上和減去整數(shù)會(huì)使周期按其自身的頻率移動(dòng)。Period不同freq(span)之間不允許算術(shù)運(yùn)算。

In [297]: p = pd.Period('2012', freq='A-DEC')
?
In [298]: p + 1
Out[298]: Period('2013', 'A-DEC')
?
In [299]: p - 3
Out[299]: Period('2009', 'A-DEC')
?
In [300]: p = pd.Period('2012-01', freq='2M')
?
In [301]: p + 2
Out[301]: Period('2012-05', '2M')
?
In [302]: p - 1
Out[302]: Period('2011-11', '2M')
?
In [303]: p == pd.Period('2012-01', freq='3M')
---------------------------------------------------------------------------
IncompatibleFrequency ? ? ? ? ? ? ? ? ? ? Traceback (most recent call last)
<ipython-input-303-4b67dc0b596c> in <module>()
----> 1 p == pd.Period('2012-01', freq='3M')
?
/pandas/pandas/_libs/tslibs/period.pyx in pandas._libs.tslibs.period._Period.__richcmp__()
?
IncompatibleFrequency: Input has different freq=3M from Period(freq=2M)

如果Period頻率是每天或更高(D,H,T,S,L,U,N),offsets和timedelta式的,可以添加,如果結(jié)果可以具有相同頻率。否則,ValueError將被提出。

In [304]: p = pd.Period('2014-07-01 09:00', freq='H')
?
In [305]: p + Hour(2)
Out[305]: Period('2014-07-01 11:00', 'H')
?
In [306]: p + timedelta(minutes=120)
Out[306]: Period('2014-07-01 11:00', 'H')
?
In [307]: p + np.timedelta64(7200, 's')
Out[307]: Period('2014-07-01 11:00', 'H')
In [1]: p + Minute(5)
Traceback
? ?...
ValueError: Input has different freq from Period(freq=H)
如果Period有其他頻率,則只能offsets添加相同的頻率。否則,ValueError將被提出。

In [308]: p = pd.Period('2014-07', freq='M')
?
In [309]: p + MonthEnd(3)
Out[309]: Period('2014-10', 'M')
In [1]: p + MonthBegin(3)
Traceback
? ?...
ValueError: Input has different freq from Period(freq=M)
獲取Period具有相同頻率的實(shí)例的差異將返回它們之間的頻率單位數(shù):

In [310]: pd.Period('2012', freq='A-DEC') - pd.Period('2002', freq='A-DEC')
Out[310]: 10
?

PeriodIndex和period_range?
Period可以在a中收集常規(guī)的對(duì)象序列,可以PeriodIndex使用period_range便利函數(shù)構(gòu)建:

In [311]: prng = pd.period_range('1/1/2011', '1/1/2012', freq='M')
?
In [312]: prng
Out[312]:?
PeriodIndex(['2011-01', '2011-02', '2011-03', '2011-04', '2011-05', '2011-06',
? ? ? ? ? ? ?'2011-07', '2011-08', '2011-09', '2011-10', '2011-11', '2011-12',
? ? ? ? ? ? ?'2012-01'],
? ? ? ? ? ? dtype='period[M]', freq='M')
該P(yáng)eriodIndex構(gòu)造也可以直接使用:

In [313]: pd.PeriodIndex(['2011-1', '2011-2', '2011-3'], freq='M')
Out[313]: PeriodIndex(['2011-01', '2011-02', '2011-03'], dtype='period[M]', freq='M')
通過乘法頻率輸出,其序列Period乘以跨度。

In [314]: pd.PeriodIndex(start='2014-01', freq='3M', periods=4)
Out[314]: PeriodIndex(['2014-01', '2014-04', '2014-07', '2014-10'], dtype='period[3M]', freq='3M')
如果start或者end是Period對(duì)象,它們將被用作錨端點(diǎn)一個(gè)PeriodIndex與頻率相匹配,所述的 PeriodIndex構(gòu)造。

In [315]: pd.PeriodIndex(start=pd.Period('2017Q1', freq='Q'),
? ?.....: ? ? ? ? ? ? ? ?end=pd.Period('2017Q2', freq='Q'), freq='M')
? ?.....:?
Out[315]: PeriodIndex(['2017-03', '2017-04', '2017-05', '2017-06'], dtype='period[M]', freq='M')
就像DatetimeIndex,a PeriodIndex也可以用來索引pandas對(duì)象:

In [316]: ps = pd.Series(np.random.randn(len(prng)), prng)
?
In [317]: ps
Out[317]:?
2011-01 ? ?0.258318
2011-02 ? -2.503700
2011-03 ? -0.303053
2011-04 ? ?0.270509
2011-05 ? ?1.004841
2011-06 ? -0.129044
2011-07 ? -1.406335
2011-08 ? -1.310412
2011-09 ? ?0.769439
2011-10 ? -0.542325
2011-11 ? ?2.010541
2011-12 ? ?1.001558
2012-01 ? -0.087453
Freq: M, dtype: float64

PeriodIndex使用相同的規(guī)則支持加法和減法Period。

In [318]: idx = pd.period_range('2014-07-01 09:00', periods=5, freq='H')
?
In [319]: idx
Out[319]:?
PeriodIndex(['2014-07-01 09:00', '2014-07-01 10:00', '2014-07-01 11:00',
? ? ? ? ? ? ?'2014-07-01 12:00', '2014-07-01 13:00'],
? ? ? ? ? ? dtype='period[H]', freq='H')
?
In [320]: idx + Hour(2)
Out[320]:?
PeriodIndex(['2014-07-01 11:00', '2014-07-01 12:00', '2014-07-01 13:00',
? ? ? ? ? ? ?'2014-07-01 14:00', '2014-07-01 15:00'],
? ? ? ? ? ? dtype='period[H]', freq='H')
?
In [321]: idx = pd.period_range('2014-07', periods=5, freq='M')
?
In [322]: idx
Out[322]: PeriodIndex(['2014-07', '2014-08', '2014-09', '2014-10', '2014-11'], dtype='period[M]', freq='M')
?
In [323]: idx + MonthEnd(3)
Out[323]: PeriodIndex(['2014-10', '2014-11', '2014-12', '2015-01', '2015-02'], dtype='period[M]', freq='M')

PeriodIndex有自己的dtype命名period,請(qǐng)參考Period Dtypes。

Period Dtypes
版本0.19.0中的新功能。

PeriodIndex有一個(gè)自定義的period dtype。這是一個(gè)類似于時(shí)區(qū)感知的dtype()的pandas擴(kuò)展dtype.datetime64[ns,tz]

的periodD型細(xì)胞保持freq屬性和表示與 period[freq]像period[D]或period[M]使用頻率字符串。

In [324]: pi = pd.period_range('2016-01-01', periods=3, freq='M')
?
In [325]: pi
Out[325]: PeriodIndex(['2016-01', '2016-02', '2016-03'], dtype='period[M]', freq='M')
?
In [326]: pi.dtype
Out[326]: period[M]
該periodD型可以使用.astype(...)。它允許一個(gè)改變 freq一個(gè)的PeriodIndex像.asfreq(),并轉(zhuǎn)換 DatetimeIndex到PeriodIndex喜歡to_period():

# change monthly freq to daily freq
In [327]: pi.astype('period[D]')
Out[327]: PeriodIndex(['2016-01-31', '2016-02-29', '2016-03-31'], dtype='period[D]', freq='D')
?
# convert to DatetimeIndex
In [328]: pi.astype('datetime64[ns]')
Out[328]: DatetimeIndex(['2016-01-01', '2016-02-01', '2016-03-01'], dtype='datetime64[ns]', freq='MS')
?
# convert to PeriodIndex
In [329]: dti = pd.date_range('2011-01-01', freq='M', periods=3)
?
In [330]: dti
Out[330]: DatetimeIndex(['2011-01-31', '2011-02-28', '2011-03-31'], dtype='datetime64[ns]', freq='M')
?
In [331]: dti.astype('period[M]')
Out[331]: PeriodIndex(['2011-01', '2011-02', '2011-03'], dtype='period[M]', freq='M')

PeriodIndex部分字符串索引
您可以在日期和字符串傳遞到Series并DataFrame與PeriodIndex在相同的方式DatetimeIndex。有關(guān)詳細(xì)信息,請(qǐng)參閱DatetimeIndex部分字符串索引。

In [332]: ps['2011-01']
Out[332]: 0.25831819727391592
?
In [333]: ps[datetime(2011, 12, 25):]
Out[333]:?
2011-12 ? ?1.001558
2012-01 ? -0.087453
Freq: M, dtype: float64
?
In [334]: ps['10/31/2011':'12/31/2011']
Out[334]:?
2011-10 ? -0.542325
2011-11 ? ?2.010541
2011-12 ? ?1.001558
Freq: M, dtype: float64

傳遞表示頻率較低的字符串會(huì)PeriodIndex返回部分切片數(shù)據(jù)。

In [335]: ps['2011']
Out[335]:?
2011-01 ? ?0.258318
2011-02 ? -2.503700
2011-03 ? -0.303053
2011-04 ? ?0.270509
2011-05 ? ?1.004841
2011-06 ? -0.129044
2011-07 ? -1.406335
2011-08 ? -1.310412
2011-09 ? ?0.769439
2011-10 ? -0.542325
2011-11 ? ?2.010541
2011-12 ? ?1.001558
Freq: M, dtype: float64
?
In [336]: dfp = pd.DataFrame(np.random.randn(600,1),
? ?.....: ? ? ? ? ? ? ? ? ? ?columns=['A'],
? ?.....: ? ? ? ? ? ? ? ? ? ?index=pd.period_range('2013-01-01 9:00', periods=600, freq='T'))
? ?.....:?
?
In [337]: dfp
Out[337]:?
? ? ? ? ? ? ? ? ? ? ? ? ?A
2013-01-01 09:00 ?0.005210
2013-01-01 09:01 -0.014385
2013-01-01 09:02 -0.212404
2013-01-01 09:03 -1.227760
2013-01-01 09:04 -0.809722
2013-01-01 09:05 -1.719723
2013-01-01 09:06 -0.808486
... ? ? ? ? ? ? ? ? ? ?...
2013-01-01 18:53 -0.783098
2013-01-01 18:54 ?0.755005
2013-01-01 18:55 -1.116732
2013-01-01 18:56 -0.940692
2013-01-01 18:57 ?0.228536
2013-01-01 18:58 ?0.109472
2013-01-01 18:59 ?0.235414
?
[600 rows x 1 columns]
?
In [338]: dfp['2013-01-01 10H']
Out[338]:?
? ? ? ? ? ? ? ? ? ? ? ? ?A
2013-01-01 10:00 -0.148998
2013-01-01 10:01 ?2.154810
2013-01-01 10:02 -1.605646
2013-01-01 10:03 ?0.021024
2013-01-01 10:04 -0.623737
2013-01-01 10:05 ?1.451612
2013-01-01 10:06 ?1.062463
... ? ? ? ? ? ? ? ? ? ?...
2013-01-01 10:53 ?0.273119
2013-01-01 10:54 -0.994071
2013-01-01 10:55 -1.222179
2013-01-01 10:56 -1.167118
2013-01-01 10:57 ?0.262822
2013-01-01 10:58 -0.283786
2013-01-01 10:59 ?1.190726
?
[60 rows x 1 columns]

與此一樣DatetimeIndex,端點(diǎn)將包含在結(jié)果中。以下示例將數(shù)據(jù)從10:00開始切換到11:59。

In [339]: dfp['2013-01-01 10H':'2013-01-01 11H']
Out[339]:?
? ? ? ? ? ? ? ? ? ? ? ? ?A
2013-01-01 10:00 -0.148998
2013-01-01 10:01 ?2.154810
2013-01-01 10:02 -1.605646
2013-01-01 10:03 ?0.021024
2013-01-01 10:04 -0.623737
2013-01-01 10:05 ?1.451612
2013-01-01 10:06 ?1.062463
... ? ? ? ? ? ? ? ? ? ?...
2013-01-01 11:53 -1.477914
2013-01-01 11:54 ?0.594465
2013-01-01 11:55 -0.903243
2013-01-01 11:56 ?1.182131
2013-01-01 11:57 ?0.621345
2013-01-01 11:58 -0.996113
2013-01-01 11:59 -0.191659
?
[120 rows x 1 columns]

使用PeriodIndex進(jìn)行頻率轉(zhuǎn)換和重采樣
頻率Period和PeriodIndex可以通過該asfreq 方法轉(zhuǎn)換。讓我們從2011財(cái)年開始,到12月結(jié)束:

In [340]: p = pd.Period('2011', freq='A-DEC')
?
In [341]: p
Out[341]: Period('2011', 'A-DEC')
我們可以將其轉(zhuǎn)換為每月頻率。使用該how參數(shù),我們可以指定是否返回開始月份或結(jié)束月份:

In [342]: p.asfreq('M', how='start')
Out[342]: Period('2011-01', 'M')
?
In [343]: p.asfreq('M', how='end')
Out[343]: Period('2011-12', 'M')
短線's'和'e'是為方便起見而提供的:

In [344]: p.asfreq('M', 's')
Out[344]: Period('2011-01', 'M')
?
In [345]: p.asfreq('M', 'e')
Out[345]: Period('2011-12', 'M')
轉(zhuǎn)換為“超級(jí)時(shí)段”(例如,年度頻率是季度頻率的超級(jí)時(shí)段)會(huì)自動(dòng)返回包含輸入時(shí)段的超級(jí)時(shí)段:

In [346]: p = pd.Period('2011-12', freq='M')
?
In [347]: p.asfreq('A-NOV')
Out[347]: Period('2012', 'A-NOV')
請(qǐng)注意,由于我們轉(zhuǎn)換為11月結(jié)束的年度頻率,因此2011年12月的月度實(shí)際上是2012年A-NOV期間。

具有錨定頻率的周期轉(zhuǎn)換對(duì)于處理經(jīng)濟(jì),商業(yè)和其他領(lǐng)域常見的各種季度數(shù)據(jù)特別有用。許多組織定義相對(duì)于其會(huì)計(jì)年度開始和結(jié)束月份的季度。因此,2011年第一季度可能在2010年啟動(dòng)或數(shù)月到2011年通過固定頻率,大熊貓適用于所有季度的頻率Q-JAN通過Q-DEC。

Q-DEC 定義常規(guī)日歷季度:

In [348]: p = pd.Period('2012Q1', freq='Q-DEC')
?
In [349]: p.asfreq('D', 's')
Out[349]: Period('2012-01-01', 'D')
?
In [350]: p.asfreq('D', 'e')
Out[350]: Period('2012-03-31', 'D')
Q-MAR 定義3月份的會(huì)計(jì)年度結(jié)束:

In [351]: p = pd.Period('2011Q4', freq='Q-MAR')
?
In [352]: p.asfreq('D', 's')
Out[352]: Period('2011-01-01', 'D')
?
In [353]: p.asfreq('D', 'e')
Out[353]: Period('2011-03-31', 'D')
?

在表示之間轉(zhuǎn)換(時(shí)間格式變換)*
使用以下方法將帶時(shí)間戳的數(shù)據(jù)轉(zhuǎn)換為PeriodIndex-ed數(shù)據(jù)to_period ,反之亦然to_timestamp:

In [354]: rng = pd.date_range('1/1/2012', periods=5, freq='M')
?
In [355]: ts = pd.Series(np.random.randn(len(rng)), index=rng)
?
In [356]: ts
Out[356]:?
2012-01-31 ? -0.898547
2012-02-29 ? -1.332247
2012-03-31 ? -0.741645
2012-04-30 ? ?0.094321
2012-05-31 ? -0.438813
Freq: M, dtype: float64
?
In [357]: ps = ts.to_period()
?
In [358]: ps
Out[358]:?
2012-01 ? -0.898547
2012-02 ? -1.332247
2012-03 ? -0.741645
2012-04 ? ?0.094321
2012-05 ? -0.438813
Freq: M, dtype: float64
?
In [359]: ps.to_timestamp()
Out[359]:?
2012-01-01 ? -0.898547
2012-02-01 ? -1.332247
2012-03-01 ? -0.741645
2012-04-01 ? ?0.094321
2012-05-01 ? -0.438813
Freq: MS, dtype: float64

請(qǐng)記住,'s'和'e'可用于返回句點(diǎn)開頭或結(jié)尾的時(shí)間戳:

In [360]: ps.to_timestamp('D', how='s')
Out[360]:?
2012-01-01 ? -0.898547
2012-02-01 ? -1.332247
2012-03-01 ? -0.741645
2012-04-01 ? ?0.094321
2012-05-01 ? -0.438813
Freq: MS, dtype: float64


在周期和時(shí)間戳之間進(jìn)行轉(zhuǎn)換可以使用一些方便的算術(shù)函數(shù)。在下面的示例中,我們將季度頻率與11月結(jié)束的年度轉(zhuǎn)換為季度結(jié)束后的月末的上午9點(diǎn):

In [361]: prng = pd.period_range('1990Q1', '2000Q4', freq='Q-NOV')
?
In [362]: ts = pd.Series(np.random.randn(len(prng)), prng)
?
In [363]: ts.index = (prng.asfreq('M', 'e') + 1).asfreq('H', 's') + 9
?
In [364]: ts.head()
Out[364]:?
1990-03-01 09:00 ? -0.564874
1990-06-01 09:00 ? -1.426510
1990-09-01 09:00 ? ?1.295437
1990-12-01 09:00 ? ?1.124017
1991-03-01 09:00 ? ?0.840428
Freq: H, dtype: float64

表示超出范圍的跨度
如果你有一個(gè)是外部的數(shù)據(jù)Timestamp范圍,請(qǐng)參閱時(shí)間戳限制,那么你可以使用PeriodIndex和/或Series中Periods做計(jì)算。

In [365]: span = pd.period_range('1215-01-01', '1381-01-01', freq='D')
?
In [366]: span
Out[366]:?
PeriodIndex(['1215-01-01', '1215-01-02', '1215-01-03', '1215-01-04',
? ? ? ? ? ? ?'1215-01-05', '1215-01-06', '1215-01-07', '1215-01-08',
? ? ? ? ? ? ?'1215-01-09', '1215-01-10',
? ? ? ? ? ? ?...
? ? ? ? ? ? ?'1380-12-23', '1380-12-24', '1380-12-25', '1380-12-26',
? ? ? ? ? ? ?'1380-12-27', '1380-12-28', '1380-12-29', '1380-12-30',
? ? ? ? ? ? ?'1380-12-31', '1381-01-01'],
? ? ? ? ? ? dtype='period[D]', length=60632, freq='D')


從int64基于YYYYMMDD的表示轉(zhuǎn)換。

In [367]: s = pd.Series([20121231, 20141130, 99991231])
?
In [368]: s
Out[368]:?
0 ? ?20121231
1 ? ?20141130
2 ? ?99991231
dtype: int64
?
In [369]: def conv(x):
? ?.....: ? ? return pd.Period(year = x // 10000, month = x//100 % 100, day = x%100, freq='D')
? ?.....:?
?
In [370]: s.apply(conv)
Out[370]:?
0 ? 2012-12-31
1 ? 2014-11-30
2 ? 9999-12-31
dtype: object
?
In [371]: s.apply(conv)[2]
Out[371]: Period('9999-12-31', 'D')

這些可以很容易地轉(zhuǎn)換為PeriodIndex:

In [372]: span = pd.PeriodIndex(s.apply(conv))
?
In [373]: span
Out[373]: PeriodIndex(['2012-12-31', '2014-11-30', '9999-12-31'], dtype='period[D]', freq='D')


?

時(shí)區(qū)處理
....
參考:http://pandas.pydata.org/pandas-docs/stable/timeseries.html

? ? ? ? ? ?http://t.csdn.cn/xoDJp文章來源地址http://www.zghlxwxcb.cn/news/detail-757385.html

到了這里,關(guān)于Pandas的時(shí)間與日期(日期轉(zhuǎn)換,創(chuàng)建日期等)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Pandas實(shí)戰(zhàn)100例 | 案例 54: 日期時(shí)間運(yùn)算

    案例 54: 日期時(shí)間運(yùn)算 知識(shí)點(diǎn)講解 當(dāng)處理帶有 datetime 類型數(shù)據(jù)的 DataFrame 時(shí),Pandas 提供了多種方法來提取和計(jì)算日期時(shí)間組件。這包括提取年份、月份、日期、星期幾以及小時(shí)等。 提取日期時(shí)間組件 : 使用 .dt 訪問器,可以從 datetime 類型的列中提取各種日期時(shí)間組件。 示例

    2024年01月16日
    瀏覽(24)
  • Pandas實(shí)戰(zhàn)100例 | 案例 20: 日期時(shí)間運(yùn)算

    案例 20: 日期時(shí)間運(yùn)算 知識(shí)點(diǎn)講解 Pandas 提供了強(qiáng)大的日期和時(shí)間處理功能。你可以從 datetime 類型的列中提取出年份、月份、日、星期等信息,也可以進(jìn)行日期時(shí)間的加減運(yùn)算。 提取日期時(shí)間信息 : 使用 dt 訪問器,你可以從 datetime 類型的列中提取出年份 ( year )、月份 ( mon

    2024年01月21日
    瀏覽(32)
  • python學(xué)習(xí)——pandas庫(kù)的使用之series及DataFrame創(chuàng)建、查看、切片、運(yùn)算

    python學(xué)習(xí)——pandas庫(kù)的使用之series及DataFrame創(chuàng)建、查看、切片、運(yùn)算

    Pandas是基于NumPy的數(shù)據(jù)分析模塊 Pandas納入了大量庫(kù)和一些標(biāo)準(zhǔn)的數(shù)據(jù)模型,提供了高效操作大型數(shù)據(jù)集所需的工具 Pandas提供了大量能使我們快速便捷處理數(shù)據(jù)的函數(shù)和方法 Pandas的數(shù)據(jù)結(jié)構(gòu) Series :帶標(biāo)簽的一維數(shù)組,與Numpy中的一維array類似。與列表也很相近。 區(qū)別是:列表

    2024年02月03日
    瀏覽(50)
  • PySpark數(shù)據(jù)分析基礎(chǔ):PySpark Pandas創(chuàng)建、轉(zhuǎn)換、查詢、轉(zhuǎn)置、排序操作詳解

    PySpark數(shù)據(jù)分析基礎(chǔ):PySpark Pandas創(chuàng)建、轉(zhuǎn)換、查詢、轉(zhuǎn)置、排序操作詳解

    目錄 前言 一、Pandas數(shù)據(jù)結(jié)構(gòu) 1.Series 2.DataFrame ?3.Time-Series ?4.Panel 5.Panel4D 6.PanelND 二、Pyspark實(shí)例創(chuàng)建 1.引入庫(kù) 2.轉(zhuǎn)換實(shí)現(xiàn) pyspark pandas series創(chuàng)建 pyspark pandas dataframe創(chuàng)建 from_pandas轉(zhuǎn)換 ?Spark DataFrame轉(zhuǎn)換 ?三、PySpark Pandas操作 1.讀取行列索引 2.內(nèi)容轉(zhuǎn)換為數(shù)組 3.DataFrame統(tǒng)計(jì)描述 4.轉(zhuǎn)

    2024年02月02日
    瀏覽(25)
  • 【js】時(shí)間和時(shí)間戳轉(zhuǎn)換、日期格式化

    1、時(shí)間戳轉(zhuǎn)換日期方法 (格式:2023-08-17) 2、日期字符串轉(zhuǎn)時(shí)間戳 3、時(shí)間戳轉(zhuǎn)換日期+時(shí)間方法 date:時(shí)間戳數(shù)字(格式:2023-08-17 14:11:01) 4、 獲取日期中文格式

    2024年02月12日
    瀏覽(21)
  • Java:日期毫秒值和常見日期時(shí)間格式相互轉(zhuǎn)換

    本文介紹了Java中,日期毫秒值和常見日期格式相互轉(zhuǎn)換。 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 代碼示例: 代碼示例: 如果想將指定時(shí)間轉(zhuǎn)換為毫秒值,相對(duì)比較麻煩,這里提供兩種方法供參考 利用Calendar.set() 利用DateFormat.parse() 本文介紹了Java中如何將毫秒

    2024年02月16日
    瀏覽(44)
  • 將時(shí)間戳按格式轉(zhuǎn)換為日期對(duì)象

    可以使用 JavaScript 中的 Date 對(duì)象對(duì)時(shí)間戳進(jìn)行格式化轉(zhuǎn)換。具體的實(shí)現(xiàn)方式可以按照以下步驟進(jìn)行: 將時(shí)間戳轉(zhuǎn)換為日期對(duì)象。JavaScript 中可以使用 new Date(timestamp) 方法將時(shí)間戳轉(zhuǎn)換為日期對(duì)象,timestamp 為時(shí)間戳。 使用日期對(duì)象的 getYear() 、 getMonth() 、 getDate() 、 getHours() 、

    2024年02月05日
    瀏覽(39)
  • MySQL時(shí)間戳與日期格式的相互轉(zhuǎn)換

    在MySQL數(shù)據(jù)庫(kù)中,時(shí)間戳(timestamp)和日期格式(date format)是常用的數(shù)據(jù)類型。時(shí)間戳表示從1970年1月1日零時(shí)到特定日期時(shí)間的秒數(shù),而日期格式則以年-月-日的形式表示日期。在MySQL中,我們可以使用函數(shù)來相互轉(zhuǎn)換時(shí)間戳和日期格式。下面我將詳細(xì)介紹如何進(jìn)行這些轉(zhuǎn)換

    2024年02月03日
    瀏覽(25)
  • SQL Server函數(shù)CONVERT–日期時(shí)間格式轉(zhuǎn)換

    語(yǔ)法: 1.值描述 data_type(length) 規(guī)定目標(biāo)數(shù)據(jù)類型(帶有可選的長(zhǎng)度)。 expression 規(guī)定需要轉(zhuǎn)換的值。 style 規(guī)定日期/時(shí)間的輸出格式。 2.cast()和convert()函數(shù)比較 cast一般更容易使用,convert的優(yōu)點(diǎn)是可以格式化日期和數(shù)值; convert一般用于日期和時(shí)間類型以及小數(shù)之間轉(zhuǎn)換,而

    2024年02月03日
    瀏覽(26)
  • Unity中獲取時(shí)間戳、日期、時(shí)間、毫秒、秒以相互轉(zhuǎn)換、自定義格式時(shí)間

    Unity中獲取時(shí)間戳、日期、時(shí)間、毫秒、秒以相互轉(zhuǎn)換、自定義格式時(shí)間

    這里附帶一個(gè)時(shí)間戳和時(shí)間轉(zhuǎn)換的網(wǎng)址 時(shí)間戳就是從1970年1月1日0時(shí)0分0秒起到現(xiàn)在的總毫秒數(shù),為什么時(shí)1970/1/1/00:00:00,因?yàn)榈谝慌_(tái)計(jì)算機(jī)發(fā)明時(shí)間是這個(gè)時(shí)間,所以時(shí)間戳誕生了。 比如說你要做一些時(shí)間相關(guān)的功能,那么基本都會(huì)用到時(shí)間戳。而且時(shí)間戳是精確的,比如說

    2024年02月05日
    瀏覽(124)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包