Python Pandas 时间序列分析

1、时间数据类型

Pandas 库中,处理时间数据是一个核心功能,特别是对于时间序列分析。Pandas 提供了专门的数据类型和一系列工具来处理时间和日期。

1)pd.Timestamp()

pd.Timestamp() 用于创建一个时间戳对象,这在处理日期和时间数据时非常有用。pd.Timestamp 实质上是 Python 标准库中 datetime.datetime 的一个替代品,但提供了更多针对金融数据等领域的功能。它是 Pandas DatetimeIndex 的基础元素。

参数说明:

参数

描述

时间数据

时间数据,可以是字符串、整数、浮点数或 datetime 对象。

tz

指定时间戳的时区,可以是字符串或时区对象。

unit

当使用数字创建时间戳时,指定数字的单位,默认为 'ns'(纳秒)。

year

指定时间戳的年份部分。

month

指定时间戳的月份部分。

day

指定时间戳的日期部分。

hour

指定时间戳的小时部分。

minute

指定时间戳的分钟部分。

second

指定时间戳的秒部分。

microsecond

指定时间戳的微秒部分。

nanosecond

指定时间戳的纳秒部分。

freq

用于指定时间频率,主要用于时间序列分析。

fold

用于处理夏令时切换期间的模糊时间。

使用示例:Python Pandas 时间序列分析-CJavaPy

2)pd.DatetimeIndex()

pd.DatetimeIndex()用于创建一个日期时间索引 (DatetimeIndex)。这对于处理时间序列数据非常有用,可以对时间数据进行高效的操作和索引。

参数说明:

参数

描述

data

用于创建 DatetimeIndex 的数据,

可以是日期字符串列表、datetime 对象列表等。

start

生成日期范围的开始日期,

通常与 'end' 或 'periods' 结合使用。

end

生成日期范围的结束日期,

通常与 'start' 结合使用。

periods

指定生成的时间戳数量,

通常与 'start' 或 'end' 结合使用。

freq

生成日期范围的频率,如 'D'(每日)、'M'(每月)等。

tz

设置时区,可以是字符串

(如 'Asia/Shanghai')或时区对象。

normalize

如果为 True,将时间标准化到午夜时间。

closed

定义区间的开闭性,

'left' 或 'right' 表示包含区间的左端点或右端点。

name

为 DatetimeIndex 设置一个名称。

dayfirst

当解析模糊的日期字符串时,确定是否优先解析为日。

yearfirst

当解析模糊的日期字符串时,确定是否优先解析为年。

dtype

DatetimeIndex 的数据类型,通常为 'datetime64[ns]'。

 使用示例:Python Pandas 时间序列分析-CJavaPy

3)pd.Timedelta()

pd.Timedelta() 是 Pandas 中用于表示时间差(即持续时间)的函数。它类似于 Python 原生的 datetime.timedelta,但提供了更多与时间序列相关的功能。pd.Timedelta 对象表示一个时间间隔,可以用来进行日期和时间的计算。

参数说明:

参数

描述

value

可以是一个字符串(如 '1 days')、整数、浮点数,

或者是一个 datetime.timedelta 对象。

这是用来定义时间差的主要方式。

unit

当 value 是一个整数或浮点数时,

unit 参数用来指定该数值的单位。

有效的单位包括 'days'、'hours'、

'minutes'、'seconds'、

'milliseconds'、'microseconds'、

'nanoseconds'。

kwargs

其他关键字参数,用于提供额外的时间单位值,

如上述 days、seconds 等。

使用示例:

import pandas as pd
import datetime

# 使用字符串创建 Timedelta
td_from_str = pd.Timedelta('2 days 3 hours 30 minutes')

# 使用整数值和单位参数创建 Timedelta
td_from_int = pd.Timedelta(42, unit='h')  # 42小时

# 直接使用天、小时等参数创建 Timedelta
td_from_components = pd.Timedelta(days=2, hours=5, minutes=30)

# 使用 datetime.timedelta 对象创建 Timedelta
td_from_datetime = pd.Timedelta(datetime.timedelta(days=1, seconds=3600))

# 输出内容
print("Timedelta from string:", td_from_str)
print("Timedelta from integer and unit:", td_from_int)
print("Timedelta from components:", td_from_components)
print("Timedelta from datetime.timedelta:", td_from_datetime)

4) pd.Period() 和 pd.period_range()

pd.Period()用于表示一个时间跨度,比如一个特定的日、月、季度或年。pd.period_range()生成一个时期范围,类似于 pd.date_range(),但用于时期而不是时间戳。

参数选项:

pd.Period()

参数

描述

value

时期的开始时间。可以是字符串、整数或另一个时期对象。

freq

时期的频率。例如 'D' 代表日,'M' 代表月,'A' 或 'Y' 代表年等。

pd.period_range()

参数

描述

start

范围的开始时间。可以是字符串或时期对象。

end

范围的结束时间。可以是字符串或时期对象。

periods

要生成的时期数量。如果指定了 start 和 end,这个参数可选。

freq

时期的频率。例如 'D'、'M'、'A' 等。

name

生成的 PeriodIndex 的名称。

使用示例:

import pandas as pd

# 创建一个月度时期
monthly_period = pd.Period(value='2021-01', freq='M')

# 创建一个年度时期
annual_period = pd.Period(value='2021', freq='A')
# 创建一个月度时期范围
monthly_period_range = pd.period_range(start='2021-01', end='2021-12', freq='M')

# 创建一个年度时期范围
annual_period_range = pd.period_range(start='2020', end='2023', freq='A')

# 创建一个固定数量的日度时期范围
daily_period_range = pd.period_range(start='2021-01-01', periods=30, freq='D')

print(monthly_period)
print(annual_period)
print(monthly_period_range)
print(annual_period_range)
print(daily_period_range)

2、时间序列功能

Pandas 时间序列分析的基础是 Series 对象。Series 对象是单变量时间序列数据结构。使用 Pandas 处理时间序列数据时,可以轻松地完成数据读取、清洗、转换、分析和可视化等任务。这些功能在金融数据分析、经济学研究、环境科学等多个领域都非常有用。

1)时间范围生成

pandas.date_range 函数是用于生成日期范围的主要工具。这个函数非常灵活,可以根据多种不同的参数来定制日期序列。

参数说明:

参数

描述

start

时间范围的开始日期。

end

时间范围的结束日期。

periods

生成的时间点的数量(如果指定了 start 和 end,则无需此参数)。

freq

频率,决定时间点之间的间隔

(例如,'D' 代表每日,'M' 代表每月,'H' 代表每小时等)。

tz

时区。

normalize

布尔值,如果为 True,则时间点将被标准化到午夜时间。

 使用示例:Python Pandas 时间序列分析-CJavaPy

2)时间频率转换

处理时间序列时常用的功能之一是时间频率的转换,包括重采样(Resampling)和频率转换(Frequency Conversion)。使用resample()方法实现重采样。重采样是改变时间序列频率的过程,包括将高频率数据转换为低频率(降采样),或将低频率数据转换为高频率(升采样)。使用asfreq()实现频率转换,引操作涉及改变时间序列的频率而不改变数据的聚合。

import pandas as pd
import numpy as np

# 创建一个日频率的时间序列
rng = pd.date_range('2020-01-01', periods=100, freq='D')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

# 1. 重采样(Resampling)
# 将日数据重采样为月数据,并计算每月的平均值
ts_monthly = ts.resample('M').mean()
print("重采样为月频率的时间序列:\n", ts_monthly)

# 2. 频率转换(Frequency Conversion)
# 将月数据转换为季度数据,保持季度末的值
ts_quarterly = ts_monthly.asfreq('Q')
print("\n转换为季度频率的时间序列:\n", ts_quarterly)

3)移动窗口

移动窗口是时间序列分析中的一个强大工具,特别适用于趋势分析、数据平滑处理等应用场景。处理时间序列数据时一个重要的功能是使用移动窗口(Moving Window)。移动窗口操作可以在固定大小的窗口上应用函数,常用于平滑数据、计算滚动统计量等。这种技术在金融数据分析中尤为常见,比如计算移动平均或移动标准差。

import pandas as pd
import numpy as np

# 创建一个时间序列
dates = pd.date_range('20230101', periods=10)
series = pd.Series(np.random.randn(10), index=dates)

# 计算移动平均
rolling_mean = series.rolling(window=3).mean()

# 计算移动标准差
rolling_std = series.rolling(window=3).std()

# 显示原始数据和移动窗口计算结果
print("原始数据:\n", series)
print("\n移动平均:\n", rolling_mean)
print("\n移动标准差:\n", rolling_std)

4)时间序列绘图

制时间序列图是一个常见且重要的操作,尤其适用于数据分析和数据可视化的领域。Pandas与Matplotlib库紧密集成,使得绘制时间序列数据变得简单直观。

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

# 创建时间序列数据
dates = pd.date_range('20230101', periods=100)
data = pd.DataFrame({'value': np.random.randn(100)}, index=dates)

data.plot()
plt.title('Time Series Plot')
plt.ylabel('Values')
plt.xlabel('Date')
plt.show()

参考文档Python Pandas 时间序列分析-CJavaPy

你可能感兴趣的:(python,pandas,开发语言)