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

转载自 http://www.mamicode.com/info-detail-1822406.html

前言

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数据之道”

### 回答1: 可以使用pandas库读取csv文件并进行数据处理。使用pandas.read_csv()函数可以读取csv文件并将其存储在pandas DataFrame中。例如: ``` import pandas as pd data = pd.read_csv("data.csv") ``` 读取完csv文件后,可以使用DataFrame的各种函数进行数据处理,如筛选、排序、统计等。最后使用to_csv函数存储到新的csv文件中 ``` data.to_csv("new_data.csv",index=False) ``` ### 回答2: Python pandas是一个数据处理库,其灵活的数据结构和数据分析能力使得它在数据处理和分析领域中受到广泛关注。其中的CSV(Comma Separated Value,逗号分隔值)文件也是广泛使用的一种数据格式。 要使用pandas处理CSV文件,需要先安装pandas库。在安装好pandas库之后,可以使用read_csv()函数将CSV文件读取到pandasDataFrame对象中进行处理。read_csv()函数有各种不同的参数选项,用于读取不同格式的CSV文件。 常见的CSV文件可以包含各种数据类型,包括字符串、整数、浮点数、日期等。pandas可以使用不同的数据类型来自动识别每一列的数据类型,也可以手动指定每一列的数据类型,从而更好地处理数据。pandas提供了一些函数来对数据进行操作,例如dropna()函数可以删除包含缺失值的行或列,fillna()函数可以用指定值填充缺失值,groupby()函数可以将数据按照指定的列进行分组。 另外,pandas还可以将数据保存到CSV文件中,使用to_csv()函数可以将DataFrame对象写入到CSV文件中,并且可以指定文件的格式和各种参数。to_csv()函数可以保存到本地文件,也可以保存到在线存储库或数据库中。 总之,pandas是一个非常强大和灵活的数据处理库,可以方便地处理各种数据类型,包括CSV文件。使用pandas可以提高数据处理和分析的效率,并且具有较好的可读性和可维护性。 ### 回答3: Python pandas是一个开源数据分析库,它提供了丰富的数据结构和函数,可以高效地处理大规模数据,并提供方便的数据分析工具,如数据过滤、排序、分组、汇总、时序数据处理等。其中,pandas的CSV数据处理功能极为强大,让我们能够轻松地读取和处理CSV数据。 CSV(Comma Separated Values)是一种常见的数据格式,通常由逗号分隔不同字段。pandas提供了read_csv()函数,可以读取CSV文件,并将其转换为pandas DataFrame对象,方便数据分析和处理。下面是一个简单的读取CSV文件的代码示例: ``` import pandas as pd data = pd.read_csv('data.csv') print(data.head()) ``` 在读取CSV文件时,我们可以通过可选参数设置一些读取选项,例如分隔符、数据类型、缺失值表示方式等。例如,将分隔符设置为制表符: ``` data = pd.read_csv('data.csv', delimiter='\t') ``` 读取CSV数据后,我们可以使用pandas DataFrame对象的各种函数进行数据分析和处理。例如,使用head()函数显示前若干行数据: ``` print(data.head(10)) ``` 使用describe()函数汇总数据的各种统计信息: ``` print(data.describe()) ``` 使用groupby()函数按照某个字段分组,并进行统计: ``` grouped_data = data.groupby('category').sum() print(grouped_data) ``` pandas还提供了to_csv()函数,可以将处理后的数据保存为CSV文件,便于后续处理和分析。 总之,pandas是一款强大的数据处理工具,对于需要处理大规模的CSV数据的工作来说,是一个非常实用的工具。合理利用pandas中的CSV数据处理功能,我们能够更轻松地处理和分析数据,提高工作效率。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值