3. 只使用适用于DatetimeIndex的方法
# 读取crime hdf5数据集,行索引设为REPORTED_DATE,检查其数据类型
In[63]: crime = pd.read_hdf('data/crime.h5', 'crime').set_index('REPORTED_DATE')
print(type(crime.index))
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>
# 用between_time方法选取发生在凌晨2点到5点的案件
In[64]: crime.between_time('2:00', '5:00', include_end=False).head()
Out[64]:
# 用at_time方法选取特定时间
In[65]: crime.at_time('5:47').head()
Out[65]:
# first方法可以选取排在前面的n个时间
# 首先将时间索引排序,然后使用pd.offsets模块
In[66]: crime_sort = crime.sort_index()
In[67]: pd.options.display.max_rows = 6
In[68]: crime_sort.first(pd.offsets.MonthBegin(6))
Out[68]:
# 前面的结果最后一条是7月的数据,这是因为pandas使用的是行索引中的第一个值,也就是2012-01-02 00:06:00
# 下面使用MonthEnd
In[69]: crime_sort.first(pd.offsets.MonthEnd(6))
Out[69]:
# 上面的结果中,6月30日的数据只有一条,这也是因为第一个时间值的原因。
# 所有的DateOffsets对象都有一个normalize参数,当其设为True时,会将所有时间归零。
# 下面就是我们想获得的结果
In[70]: crime_sort.first(pd.offsets.MonthBegin(6, normalize=True))
Out[70]:
# 选取2012-06的数据
In[71]: crime_sort.loc[:'2012-06']
Out[71]:
一些时间差的别名
http://pandas.pydata.org/pandas-docs/stable/timeseries.html# offset-aliases
## 5天
In[72]: crime_sort.first('5D')
Out[72]:
## 5个工作日
In[73]: crime_sort.first('5B')
Out[73]:
## 7周
In[74]: crime_sort.first('7W')
Out[74]:
# 第3季度开始
In[75]: crime_sort.first('3QS')
Out[75]:
原理
# 使用datetime模块的time对象
In[76]: import datetime
crime.between_time(datetime.time(2,0), datetime.time(5,0), include_end=False)
Out[76]:
# 选取第一个时间
# 用两种方法加六个月
In[77]: first_date = crime_sort.index[0]
first_date
Out[77]: Timestamp('2012-01-02 00:06:00')
In[78]: first_date + pd.offsets.MonthBegin(6)
Out[78]: Timestamp('2012-07-01 00:06:00')
In[79]: first_date + pd.offsets.MonthEnd(6)
Out[79]: Timestamp('2012-06-30 00:06:00')
更多
# 使用自定义的DateOffset对象
In[80]: dt = pd.Timestamp('2012-1-16 13:40')
dt + pd.DateOffset(months=1)
Out[80]: Timestamp('2012-02-16 13:40:00')
# 一个使用更多日期和时间的例子
In[81]: do = pd.DateOffset(years=2, months=5, days=3, hours=8, seconds=10)
pd.Timestamp('2012-1-22 03:22') + do
Out[81]: Timestamp('2014-06-25 11:22:10')
In[82]: pd.options.display.max_rows=60