df.columns = ['date','number']
df['date'] = pd.to_datetime(df['date'])
df = df.set_index('date')
print(df.head(2))
print(df.tail(2))
print(df.shape)
number
2013-10-24 3
2013-10-25 4
number
2017-02-14 6
2017-02-22 6
(425, 1)
df的行数一共是425行。
查看Dataframe的数据类型
print(type(df))
print(df.index)
print(type(df.index))
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex(['2013-10-24', '2013-10-25', '2013-10-29', '2013-10-30',
'2013-11-04', '2013-11-06', '2013-11-08', '2013-11-12',
'2013-11-14', '2013-11-25',
'2017-01-03', '2017-01-07', '2017-01-14', '2017-01-17',
'2017-01-23', '2017-01-25', '2017-01-26', '2017-02-07',
'2017-02-14', '2017-02-22'],
dtype='datetime64[ns]', name='date', length=425, freq=None)
<class 'pandas.tseries.index.DatetimeIndex'>
构造Series类型数据
s = pd.Series(df['number'], index=df.index)
print(type(s))
s.head(2)
<class 'pandas.core.series.Series'>
2013-10-24 3
2013-10-25 4
Name: number, dtype: int64
2 按日期筛选数据
按年度获取数据
print('---------获取2013年的数据-----------')
print(df['2013'].head(2))
print(df['2013'].tail(2))
---------获取2013年的数据-----------
number
2013-10-24 3
2013-10-25 4
number
2013-12-27 2
2013-12-30 2
获取2016至2017年的数据
print('---------获取2016至2017年的数据-----------')
print(df['2016':'2017'].head(2))
print(df['2016':'2017'].tail(2))
---------获取2016至2017年的数据-----------
number
2016-01-04 4
2016-01-07 6
number
2017-02-14 6
2017-02-22 6
获取某月的数据
print('---------获取某月的数据-----------')
print(df['2013-11'])
---------获取某月的数据-----------
number
2013-11-04 1
2013-11-06 3
2013-11-08 1
2013-11-12 5
2013-11-14 2
2013-11-25 1
2013-11-29 1
获取具体某天的数据
请注意dataframe类型的数据,获取具体某天的数据时,跟series是有些差异的,详细情况如下述代码所示:
print('---------获取具体某天的数据-----------')
print(s['2013-11-06'])
print(df['2013-11-06':'2013-11-06'])
---------获取具体某天的数据-----------
number
2013-11-06 3
dataframe的truncate函数可以获取某个时期之前或之后的数据,或者某个时间区间的数据
但一般建议直接用切片(slice),这样更为直观,方便
print('---------获取某个时期之前或之后的数据-----------')
print('--------after------------')
print(df.truncate(after = '2013-11'))
print('--------before------------')
print(df.truncate(before='2017-02'))
---------获取某个时期之前或之后的数据-----------
--------after------------
number
2013-10-24 3
2013-10-25 4
2013-10-29 2
2013-10-30 1
--------before------------
number
2017-02-07 8
2017-02-14 6
2017-02-22 6
3 按日期显示数据
3.1 to_period()方法
请注意df.index的数据类型是DatetimeIndex;
df_peirod的数据类型是PeriodIndex
按月显示,但不统计
df_period = df.to_period('M')
print(type(df_period))
print(type(df_period.index))
print(df_period.head())
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.tseries.period.PeriodIndex'>
number
2013-10 3
2013-10 4
2013-10 2
2013-10 1
2013-11 1
按季度显示,但不统计
print(df.to_period('Q').head())
number
2013Q4 3
2013Q4 4
2013Q4 2
2013Q4 1
2013Q4 1
按年度显示,但不统计
print(df.to_period('A').head())
number
2013 3
2013 4
2013 2
2013 1
2013 1
3.2 asfreq()方法
按年度频率显示
df_period.index.asfreq('A')
PeriodIndex(['2013', '2013', '2013', '2013', '2013', '2013', '2013', '2013',
'2013', '2013',
'2017', '2017', '2017', '2017', '2017', '2017', '2017', '2017',
'2017', '2017'],
dtype='period[A-DEC]', name='date', length=425, freq='A-DEC')
df_period.index.asfreq('A-JAN')
PeriodIndex(['2014', '2014', '2014', '2014', '2014', '2014', '2014', '2014',
'2014', '2014',
'2017', '2017', '2017', '2017', '2017', '2017', '2017', '2018',
'2018', '2018'],
dtype='period[A-JAN]', name='date', length=425, freq='A-JAN')
按年度频率在不同情形下的显示,可参考下图所示:
df_period.index.asfreq('Q')
PeriodIndex(['2013Q4', '2013Q4', '2013Q4', '2013Q4', '2013Q4', '2013Q4',
'2013Q4', '2013Q4', '2013Q4', '2013Q4',
'2017Q1', '2017Q1', '2017Q1', '2017Q1', '2017Q1', '2017Q1',
'2017Q1', '2017Q1', '2017Q1', '2017Q1'],
dtype='period[Q-DEC]', name='date', length=425, freq='Q-DEC')
df_period.index.asfreq('Q-SEP')
PeriodIndex(['2014Q1', '2014Q1', '2014Q1', '2014Q1', '2014Q1', '2014Q1',
'2014Q1', '2014Q1', '2014Q1', '2014Q1',
'2017Q2', '2017Q2', '2017Q2', '2017Q2', '2017Q2', '2017Q2',
'2017Q2', '2017Q2', '2017Q2', '2017Q2'],
dtype='period[Q-SEP]', name='date', length=425, freq='Q-SEP')
按季度频率在不同情形下的显示,可参考下图所示:
df_period.index.asfreq('M')
PeriodIndex(['2013-10', '2013-10', '2013-10', '2013-10', '2013-11', '2013-11',
'2013-11', '2013-11', '2013-11', '2013-11',
'2017-01', '2017-01', '2017-01', '2017-01', '2017-01', '2017-01',
'2017-01', '2017-02', '2017-02', '2017-02'],
dtype='period[M]', name='date', length=425, freq='M')
按工作日显示
method 1
df_period.index.asfreq('B', how='start')
PeriodIndex(['2013-10-01', '2013-10-01', '2013-10-01', '2013-10-01',
'2013-11-01', '2013-11-01', '2013-11-01', '2013-11-01',
'2013-11-01', '2013-11-01',
'2017-01-02', '2017-01-02', '2017-01-02', '2017-01-02',
'2017-01-02', '2017-01-02', '2017-01-02', '2017-02-01',
'2017-02-01', '2017-02-01'],
dtype='period[B]', name='date', length=425, freq='B')
method 2
df_period.index.asfreq('B', how='end')
PeriodIndex(['2013-10-31', '2013-10-31', '2013-10-31', '2013-10-31',
'2013-11-29', '2013-11-29', '2013-11-29', '2013-11-29',
'2013-11-29', '2013-11-29',
'2017-01-31', '2017-01-31', '2017-01-31', '2017-01-31',
'2017-01-31', '2017-01-31', '2017-01-31', '2017-02-28',
'2017-02-28', '2017-02-28'],
dtype='period[B]', name='date', length=425, freq='B')
4 按日期统计数据
4.1按日期统计数据
按周统计数据
print(df.resample('w').sum().head())
number
2013-10-27 7.0
2013-11-03 3.0
2013-11-10 5.0
2013-11-17 7.0
2013-11-24 NaN
按月统计数据
print(df.resample('M').sum().head())
number
2013-10-31 10
2013-11-30 14
2013-12-31 27
2014-01-31 16
2014-02-28 4
按季度统计数据
print(df.resample('Q').sum().head())
number
2013-12-31 51
2014-03-31 73
2014-06-30 96
2014-09-30 136
2014-12-31 148
按年统计数据
print(df.resample('AS').sum())
number
2013-01-01 51
2014-01-01 453
2015-01-01 743
2016-01-01 1552
2017-01-01 92
关于日期的类型,按参考下图所示来选择合适的分期频率: