Pandas日期数据处理:如何按日期筛选、显示及统计数据

前言
pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面:
- 按日期筛选数据
- 按日期显示数据
- 按日期统计数据
运行环境为 windows系统,64位,python3.5。
1 读取并整理数据
- 首先引入pandas库
import pandas as pd
- 从csv文件中读取数据
df = pd.read_csv('date.csv', header=None)
print(df.head(2))
0 1
0 2013-10-24 3
1 2013-10-25 4
- 整理数据
df.columns = ['date','number']
df['date'] = pd.to_datetime(df['date']) #将数据类型转换为日期类型
df = df.set_index('date') # 将date设置为index
print(df.head(2))
print(df.tail(2))
print(df.shape)
number
date
2013-10-24 3
2013-10-25 4
number
date
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'>
date
2013-10-24 3
2013-10-25 4
Name: number, dtype: int64
2 按日期筛选数据
按年度获取数据
print('---------获取2013年的数据-----------')
print(df['2013'].head(2)) # 获取2013年的数据
print(df['2013'].tail(2)) # 获取2013年的数据
---------获取2013年的数据-----------
number
date
2013-10-24 3
2013-10-25 4
number
date
2013-12-27 2
2013-12-30 2
获取2016至2017年的数据
print('---------获取2016至2017年的数据-----------')
print(df['2016':'2017'].head(2)) #获取2016至2017年的数据
print(df['2016':'2017'].tail(2)) #获取2016至2017年的数据
---------获取2016至2017年的数据-----------
number
date
2016-01-04 4
2016-01-07 6
number
date
2017-02-14 6
2017-02-22 6
获取某月的数据
print('---------获取某月的数据-----------')
print(df['2013-11']) # 获取某月的数据
---------获取某月的数据-----------
number
date
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'])
# 获取具体某天的数据,用datafrme直接选取某天时会报错,而series的数据就没有问题
# print(df['2013-11-06'])
#可以考虑用区间来获取某天的数据
print(df['2013-11-06':'2013-11-06'])
---------获取具体某天的数据-----------
3
number
date
2013-11-06 3
- dataframe的truncate函数可以获取某个时期之前或之后的数据,或者某个时间区间的数据
- 但一般建议直接用切片(slice),这样更为直观,方便
# dataframe的truncate函数可以获取某个时期之前或之后的数据,或者某个时间区间的数据
# 但一般建议直接用切片(slice),这样更为直观,方便
print('---------获取某个时期之前或之后的数据-----------')
print('--------after------------')
print(df.truncate(after = '2013-11'))
print('--------before------------')
print(df.truncate(before='2017-02'))
---------获取某个时期之前或之后的数据-----------
--------after------------
number
date
2013-10-24 3
2013-10-25 4
2013-10-29 2
2013-10-30 1
--------before------------
number
date
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))
# 请注意df.index的数据类型是DatetimeIndex;
# df_peirod的数据类型是PeriodIndex
print(df_period.head())
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.tseries.period.PeriodIndex'>
number
date
2013-10 3
2013-10 4
2013-10 2
2013-10 1
2013-11 1
按季度显示,但不统计
print(df.to_period('Q').head()) #按季度显示,但不统计
number
date
2013Q4 3
2013Q4 4
2013Q4 2
2013Q4 1
2013Q4 1
按年度显示,但不统计
print(df.to_period('A').head()) #按年度显示,但不统计
number
date
2013 3
2013 4
2013 2
2013 1
2013 1
3.2 asfreq()方法
按年度频率显示
df_period.index.asfreq('A') # 'A'默认是'A-DEC',其他如'A-JAN'
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') # 'A'默认是'A-DEC',其他如'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') # 'Q'默认是'Q-DEC',其他如“Q-SEP”,“Q-FEB”
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') # 可以显示不同的季度财年,“Q-SEP”,“Q-FEB”
# df_period.index = df_period.index.asfreq('Q-DEC') # 可以显示不同的季度财年,“Q-SEP”,“Q-FEB”
# print(df_period.head())
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())
# “w”,week
number
date
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())
# "MS"是每个月第一天为开始日期, "M"是每个月最后一天
number
date
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())
# "QS"是每个季度第一天为开始日期, "Q"是每个季度最后一天
number
date
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())
# "AS"是每年第一天为开始日期, "A是每年最后一天
number
date
2013-01-01 51
2014-01-01 453
2015-01-01 743
2016-01-01 1552
2017-01-01 92
- 关于日期的类型,按参考下图所示来选择合适的分期频率:

4.2 按日期统计后,按年或季度或月份显示
按年统计并显示
print(df.resample('AS').sum().to_period('A'))
# 按年统计并显示
number
date
2013 51
2014 453
2015 743
2016 1552
2017 92
按季度统计并显示
print(df.resample('Q').sum().to_period('Q').head())
# 按季度统计并显示
number
date
2013Q4 51
2014Q1 73
2014Q2 96
2014Q3 136
2014Q4 148
按月度统计并显示
print(df.resample('M').sum().to_period('M').head())
# 按月度统计并显示
number
date
2013-10 10
2013-11 14
2013-12 27
2014-01 16
2014-02 4
更多精彩内容请关注微信公众号:
“Python数据之道”

Pandas日期数据处理:如何按日期筛选、显示及统计数据的更多相关文章
- hightmaps 按地图上显示的统计数据
离extjs 至 easyui 到html5到hightchars 再到hightmaps.Exjts和easyui很相似,extjs是重量级的,easyui轻量级的.比extjs容易上手.照着dem ...
- pandas处理日期时间,按照时间筛选
pandas有着强大的日期数据处理功能,本期我们来了解下pandas处理日期数据的一些基本功能,主要包括以下三个方面: 按日期筛选数据 按日期显示数据 按日期统计数据 运行环境为 windows系统, ...
- JQuery EasyUI 日期控件 怎样做到只显示年月,而不显示日
标题问题的答案在OSChina中 http://www.oschina.net/question/2282354_224401?fromerr=lHJTcN89 我还是把这个记录下来 ======== ...
- js日期、月份:日期加一天等
// 日期,在原有日期基础上,增加days天数,默认增加1天 function addDate(date, days) { if (days == undefined || days == '') { ...
- 结束日期必须大于开始日期--My97DatePicker日历控制的又一方便之处
在做时间查询时,有时需要两个日期,从一个日期到另外一个日期的那种,但是这样会有一个问题,比如后者的结束日期晚于开始日期怎么办?用JS写验证,麻烦,呵呵,用这个日历控件,可方便实现结束日期只显示开始日期 ...
- js如何通过末次月经日期计算预产日期
计算方式有两种 1)直接添加280天 2)添加10月8天(参数传递,可用改成9月7天等) js中引入文件 <script src="js/jquery.min.js"> ...
- [Swift实际操作]七、常见概念-(6)日期Date和DateFormatter日期的格式化
本文将为你演示日期类型的使用,以及如何对日期进行格式化. 首先引入需要使用到的界面框架 import UIKit 初始化一个日期对象,它的值和当前电脑中的日期相同 var date = Date() ...
- delphi ----日期控件运用,日期问题,日期时间比较
一.日期控件 1.DateTimePicker 1)只显示年月 DateMode:dmUpDown format:yyyy-MM 2)将DateTimePicker的Format属性中加入日期格式设成 ...
- 2019-11-19-git-修改commit日期为之前的日期
title author date CreateTime categories git 修改commit日期为之前的日期 lindexi 2019-11-19 08:53:16 +0800 2018- ...
随机推荐
- Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试
日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...
- Python实现简易端口扫描器
在网上的一些资料的基础上自己又添了些新内容,算是Python socket编程练手吧. #coding=utf-8 import socket import time import sys impor ...
- 关于sql、mysql语句的模糊查询分类与详解,包括基本用法和mapper.xml文件里插入写法
欢迎猿类加qq:2318645572,共同学习进步 实际例子: ssm框架:service业务层->dao层->mappers.xml->junit/test测试 1:service ...
- SpringMVC文件上传下载
不多说,代码: Spring-config.xml<!-- spring可以自动去扫描base-pack下面的包或者子包下面的java文件, 如果扫描到有Spring的相关注解的类,则把这些类注 ...
- 浅谈 虚方法(virtual)
虚方法 理解:从字面意思来讲,"虚",可有可无,子类对父类的某种方法的重写,可以重写,也可以不重写. 虚方法,顾名思义(装个13),就是某种方法. 用法:public virtua ...
- MySQL最常用分组聚合函数
一.聚合函数(aggregation function)---也就是组函数 在一个行的集合(一组行)上进行操作,对每个组给一个结果. 常用的组函数: AVG([distinct] expr) 求平均值 ...
- Android的root学习
Android的内核就是Linux,所以Android获取root其实和Linux获取root权限是一回事儿.在Linux下获取root权限的时候就是执行sudo或者su,接下来系统会提示输入root ...
- 纯JS单页面赛车游戏代码分享
分享一个以前写的小游戏,纯js游戏,代码很简单.欢迎大家来喷呦! 效果图: 代码展示://直接复制到html文件即可 支持IE9+版本 <!DOCTYPE html> <html&g ...
- xmlplus 组件设计系列之七 - 路由
在浏览器端,对路由的理解一般是根据不同的 URL 完成页面的切换.在服务器端,则是根据不同的 URL 请求回馈相关的页面.在本章,我们讲述的是根据接收到的不同命令,路由组件呈现出不同的页面,这算是广义 ...
- CentOS_5.6下使用cmake编译MySQL_5.5.11
MySQL 最新的版本5.5.11需要cmake编译安装,估计以后的版本也会采用这种方式,网上找了一些安装方法有些地方是错的,自己整理一份 所以特地记录一下安装步骤及过程,以供参考!1 mysql 5 ...