Pandas时间序列处理

本文介绍了Pandas中处理时间序列的关键操作,包括pd.to_datetime转换日期字符串,pd.date_range生成日期序列,Series.dt对象获取日期信息,strftime函数格式化日期,以及dt.timedelta计算时间差。重点掌握了pd.to_datetime、Series.dt对象和strftime函数的应用。


本节我们介绍在处理日期时间时的一些常用的处理方法,以一份酒店入住数据为例进行讲解。pandas 用 Timestamp 表示时点数,在大多数情况下和 python 的 datetime 类型的使用方法是通用的。

首先读入数据:

data=pd.read_csv('data/hotel.csv')
data.head()

在这里插入图片描述

一、pd.to_datetime实现日期字符串转日期

  • api:pd.to_datetime(str) 字符串类型对象转换成日期类型对象
 In[]:data['入住日期'].dtype #查看'入住日期'列的类型  为object类型,即字符串对象
Out[]:dtype('O')
 In[]:data.loc[:,'入住日期']=pd.to_datetime(data['入住日期'])#将'入住日期'列抓换成日期型后赋给'入住日期'列
            data['入住日期'].dtype#再次输出'入住日期'列的类型  为日期型
Out[]:dtype('<M8[ns]')#日期类型

二、pd.date_range生成日期序列

  • api:pd.date_range(start=None, end=None, periods=None, freq=‘D’)
    • start:起始日期,字符串
    • end:终止日期,字符串
    • periods:期数,取值为整数或None
    • freq:频率或日期偏移量,取值为string或DateOffset,默认为’D’

该函数主要用于生成一个固定频率的时间索引,在调用构造方法时,必须指定start、end、periods中的两个参数值,否则报错。

In [12]: pd.date_range(start='20170101',end='20170110')
Out[12]:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10'],
              dtype='datetime64[ns]', freq='D')

In [13]: pd.date_range(start='20170101',periods=10)
Out[13]:
DatetimeIndex(['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04',
               '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-08',
               '2017-01-09', '2017-01-10'],
              dtype='datetime64[ns]', freq='D')

常用频率和日期偏移量:
在这里插入图片描述

三、Series.dt对象

  • pandas 的 pandas.Series.dt 可以获得日期/时间类型的相关信息,返回值均为int型。比如:
data['入住日期'].dt.year  #获取年份
data['入住日期'].dt.month  #获取月份
data['入住日期'].dt.quarter  #获取季度
  • 为数据表添加新列’入住月份’:
#提取data['入住日期']的月份信息并存到新的一列中
data.loc[:,'入住月份']=data['入住日期'].dt.month
data.head()

在这里插入图片描述

  • 为数据表添加新列’in_weekday’:
#提取data['入住日期']的weekday信息并存到新的一列中
data.loc[:,'in_weekday']=data['入住日期'].dt.weekday
data.head()

在这里插入图片描述

  • pandas.Series.dt对象能够返回的信息有:
类别解释
year
month
day
hour
minute分钟
second
date返回日期
time返回时间
dayofyear年序日
weekofyear年序周
week
dayofweek周中的星期几,ex: Friday
quarter季度
days_in_month一个月中有多少天
is_month_start是否月初第一天
is_month_end是否月末最后一天
is_quarter_start是否季度的最开始
is_quarter_end是否季度的最后一个
is_year_start是否年初第一天
is_year_end是否年末第一天

四、strftime函数格式化日期

  • strftime函数实际上是datetime模块中的函数,并不是pandas中的成员,在实际工作中我们常用这种方式对日期进行格式化
    • api:datetime.strftime(date,format_str)
      • date:需要格式化的日期
      • format_str:格式化字符串
    • 例如:我们需要提取’入住日期’的年份和月份组成一个新的列:
#首先需要引入datetime模块
from datetime import datetime
#配合apply函数
data.loc[:,'入住年月']=data['入住日期'].apply(lambda x:datetime.strftime(x,"%Y-%m"))
data.head()

在这里插入图片描述
常用格式字符串介绍:
在这里插入图片描述

  • Series.dt.to_period 另一种方法
data.loc[:,'入住年月2']= data['入住日期'].dt.to_period('M')
data.head()

在这里插入图片描述
第二种方法使用起来更加简单,参数 M 表示月份,Q 表示季度,A 表示年度,D 表示按天,这几个参数比较常用。

五、 时间差(dt.timedelta)

时间差(dt.timedelta)是时间上的差异,以不同的单位来表示。例如:日,小时,分钟,秒。它们可以是正值,可正可负;大多数情况下可与datetime.timedelta互换,一般用来表示两个日期之间的差距。

例如:我们想获取客人的入住天数:

data.loc[:,'离店日期']=pd.to_datetime(data['离店日期']) #将'离店日期'列转换成日期格式
data['离店日期']-data['入住日期']#离店日期-入住日期

在这里插入图片描述
结果是一个timedelta类型的Series,并不是我们希望得到的天数,我们还需要访问timedelta对象的属性来提取天数

time=data['离店日期']-data['入住日期']
data.loc[:,'入住天数']=time.dt.days#通过访问timedelta.dt对象的days属性拿到天数
data.head()

在这里插入图片描述
timedelta对象有属性:days、seconds、microseconds

六、总结

  • pd.to_datetime(str) 【掌握】
  • pd.date_range(start=None, end=None, periods=None, freq=‘D’)【知道】
    • start:起始日期 字符串
    • end:终止日期,字符串
    • periods:期数,取值为整数或None
    • freq:频率或日期偏移量,取值为string或DateOffset,默认为’D’
    • 必须指定start、end、periods中的两个参数值,否则报错
  • Series.dt对象【掌握】
    • data[‘入住日期’].dt.year #获取年份
    • data[‘入住日期’].dt.month #获取月份
    • data[‘入住日期’].dt.quarter #获取季度
  • datetime.strftime(date,format_str)【掌握】
    • date:需要格式化的日期
    • format_str:格式化字符串
  • (data[‘离店日期’]-data[‘入住日期’]).dt.days【知道】
### Pandas时间序列数据的处理与分析 Pandas 是一种广泛应用于数据分析的强大工具,特别适合于处理时间序列数据。以下是有关如何利用 Pandas 进行时间序列数据处理和分析的关键方法。 #### 数据准备 在实际应用中,原始数据可能以多种格式存储,尤其是涉及时间的数据字段通常是以字符串形式存在。为了便于后续的操作,需将这些字符串转换为标准的时间戳对象。通过 `pd.to_datetime` 函数可实现这一目标[^3]: ```python import pandas as pd data = {'Date': ['2023-01-01', '2023-01-02', '2023-01-03'], 'Value': [10, 20, 30]} df = pd.DataFrame(data) # 将字符串类型的日期列转换为 datetime 类型 df['Date'] = pd.to_datetime(df['Date']) # 设置索引为日期列以便更高效地操作时间序列数据 df.set_index('Date', inplace=True) print(df) ``` 上述代码展示了如何创建一个简单的 DataFrame 并将其日期列为索引。设置时间为索引有助于简化许多基于时间的操作。 #### 基本操作 一旦设置了时间作为索引,就可以执行各种基本操作来探索和管理时间序列数据。例如,可以通过切片访问特定时间段内的记录[^1]: ```python subset_df = df['2023-01-01':'2023-01-02'] print(subset_df) ``` 此代码片段演示了按日期范围筛选子集的功能。 #### 高级功能 除了基础操作外,Pandas 提供了许多高级特性支持复杂的时间序列分析任务。其中包括但不限于重采样 (Resampling),滚动窗口计算 (Rolling Window Calculations) 和时区处理等功能[^2]。 ##### 重采样 重采样的目的是改变观测频率,比如从每日汇总到每月平均值: ```python monthly_avg = df.resample('M').mean() print(monthly_avg) ``` 这里使用了 `'M'` 参数表示月末频率进行聚合运算。 ##### 滚动窗口统计量 对于滑动窗口上的统计数据计算也很常见,在金融领域尤为如此: ```python rolling_mean = df.rolling(window=2).mean() print(rolling_mean) ``` 这段脚本定义了一个大小为两个周期的移动窗口并求其均值。 ##### 时区本地化与时区转换 当涉及到跨区域或者全球分布的数据源时,考虑及时调整至统一标准就显得尤为重要: ```python df.index = df.index.tz_localize('UTC') # 添加 UTC 时区信息 converted_tz = df.index.tz_convert('US/Eastern') # 转换为东部时间 print(converted_tz) ``` 以上例子说明了怎样给无时区标记的时间添加默认时区以及切换成其他指定地区对应的时区。 --- ### 总结 综上所述,借助 Pandas 库能够便捷而有效地完成各类时间序列相关的工作流程,无论是初步清洗还是深入挖掘都有相应的解决方案可供选用[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值