3. 只使用适用于DatetimeIndex的方法

  1. # 读取crime hdf5数据集,行索引设为REPORTED_DATE,检查其数据类型
  2. In[63]: crime = pd.read_hdf('data/crime.h5', 'crime').set_index('REPORTED_DATE')
  3. print(type(crime.index))
  4. <class 'pandas.core.indexes.datetimes.DatetimeIndex'>
  1. # 用between_time方法选取发生在凌晨2点到5点的案件
  2. In[64]: crime.between_time('2:00', '5:00', include_end=False).head()
  3. Out[64]:

3. 只使用适用于DatetimeIndex的方法 - 图1

  1. # 用at_time方法选取特定时间
  2. In[65]: crime.at_time('5:47').head()
  3. Out[65]:

3. 只使用适用于DatetimeIndex的方法 - 图2

  1. # first方法可以选取排在前面的n个时间
  2. # 首先将时间索引排序,然后使用pd.offsets模块
  3. In[66]: crime_sort = crime.sort_index()
  4. In[67]: pd.options.display.max_rows = 6
  5. In[68]: crime_sort.first(pd.offsets.MonthBegin(6))
  6. Out[68]:

3. 只使用适用于DatetimeIndex的方法 - 图3

  1. # 前面的结果最后一条是7月的数据,这是因为pandas使用的是行索引中的第一个值,也就是2012-01-02 00:06:00
  2. # 下面使用MonthEnd
  3. In[69]: crime_sort.first(pd.offsets.MonthEnd(6))
  4. Out[69]:

3. 只使用适用于DatetimeIndex的方法 - 图4

  1. # 上面的结果中,6月30日的数据只有一条,这也是因为第一个时间值的原因。
  2. # 所有的DateOffsets对象都有一个normalize参数,当其设为True时,会将所有时间归零。
  3. # 下面就是我们想获得的结果
  4. In[70]: crime_sort.first(pd.offsets.MonthBegin(6, normalize=True))
  5. Out[70]:

3. 只使用适用于DatetimeIndex的方法 - 图5

  1. # 选取2012-06的数据
  2. In[71]: crime_sort.loc[:'2012-06']
  3. Out[71]:

3. 只使用适用于DatetimeIndex的方法 - 图6

一些时间差的别名
http://pandas.pydata.org/pandas-docs/stable/timeseries.html# offset-aliases

  1. ## 5天
  2. In[72]: crime_sort.first('5D')
  3. Out[72]:

3. 只使用适用于DatetimeIndex的方法 - 图7

  1. ## 5个工作日
  2. In[73]: crime_sort.first('5B')
  3. Out[73]:

3. 只使用适用于DatetimeIndex的方法 - 图8

  1. ## 7周
  2. In[74]: crime_sort.first('7W')
  3. Out[74]:

3. 只使用适用于DatetimeIndex的方法 - 图9

  1. # 第3季度开始
  2. In[75]: crime_sort.first('3QS')
  3. Out[75]:

3. 只使用适用于DatetimeIndex的方法 - 图10

原理

  1. # 使用datetime模块的time对象
  2. In[76]: import datetime
  3. crime.between_time(datetime.time(2,0), datetime.time(5,0), include_end=False)
  4. Out[76]:

3. 只使用适用于DatetimeIndex的方法 - 图11

  1. # 选取第一个时间
  2. # 用两种方法加六个月
  3. In[77]: first_date = crime_sort.index[0]
  4. first_date
  5. Out[77]: Timestamp('2012-01-02 00:06:00')
  6. In[78]: first_date + pd.offsets.MonthBegin(6)
  7. Out[78]: Timestamp('2012-07-01 00:06:00')
  8. In[79]: first_date + pd.offsets.MonthEnd(6)
  9. Out[79]: Timestamp('2012-06-30 00:06:00')

更多

  1. # 使用自定义的DateOffset对象
  2. In[80]: dt = pd.Timestamp('2012-1-16 13:40')
  3. dt + pd.DateOffset(months=1)
  4. Out[80]: Timestamp('2012-02-16 13:40:00')
  1. # 一个使用更多日期和时间的例子
  2. In[81]: do = pd.DateOffset(years=2, months=5, days=3, hours=8, seconds=10)
  3. pd.Timestamp('2012-1-22 03:22') + do
  4. Out[81]: Timestamp('2014-06-25 11:22:10')
  1. In[82]: pd.options.display.max_rows=60