Pandas 是 Python 中用于数据处理和分析的库。它提供了一系列时间序列分析工具,可以分析和预测时间序列数据。Pandas 使得处理复杂的时间序列数据变得直观和高效,适用于各种金融、经济、科学和工程领域的时间序列分析任务。通过使用 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

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

使用示例:

import pandas as pd
from pandas.tseries.offsets import Day, Minute

# 创建时间戳
timestamp1 = pd.Timestamp('2024-01-01')
timestamp2 = pd.Timestamp(year=2024, month=1, day=1)
timestamp_with_time = pd.Timestamp('2024-01-01 08:30:00')
timestamp_unix = pd.Timestamp(1609459200, unit='s')
timestamp_tz = pd.Timestamp('2024-01-01', tz='US/Eastern')

# 输出创建的时间戳
print("Timestamp1:", timestamp1)
print("Timestamp2:", timestamp2)
print("Timestamp with Time:", timestamp_with_time)
print("Unix Timestamp:", timestamp_unix)
print("Timestamp with Timezone:", timestamp_tz)

# 转换时区
timestamp_tz_converted = timestamp_tz.tz_convert('UTC')
print("Timestamp with Converted Timezone:", timestamp_tz_converted)

# 访问时间戳的不同部分
print("Year:", timestamp1.year)
print("Month:", timestamp1.month)
print("Day:", timestamp1.day)
print("Hour:", timestamp1.hour)

# 时间戳加减
print("Timestamp + 10 Days:", timestamp1 + 10 * Day())
print("Timestamp - 30 Minutes:", timestamp1 - 30 * Minute())

# 格式化时间戳为字符串
formatted_str = timestamp1.strftime('%Y-%m-%d %H:%M:%S')
print("Formatted Timestamp:", formatted_str)

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]'。

使用示例:

import pandas as pd

# 使用 data 参数创建 DatetimeIndex
datetime_index = pd.DatetimeIndex(['2024-01-01', '2024-01-02', '2024-01-03'])

# 使用 start 和 end 参数创建每日的日期范围
daily_index = pd.date_range(start='2024-01-01', end='2024-01-07', freq='D')

# 使用 periods 和 freq 参数创建定期时间序列
periodic_index = pd.date_range(start='2024-01-01', periods=5, freq='M')

# 创建带时区的 DatetimeIndex
tz_index = pd.date_range(start='2024-01-01', periods=3, tz='UTC')

# 使用 normalize 参数
normalized_index = pd.date_range(start='2024-01-01 08:30:00', periods=3, normalize=True)

# 打印创建的示例
print("DatetimeIndex using 'data':", datetime_index)
print("Daily index using 'start' and 'end':", daily_index)
print("Periodic index using 'periods' and 'freq':", periodic_index)
print("DatetimeIndex with timezone:", tz_index)
print("Normalized index:", normalized_index)

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,则时间点将被标准化到午夜时间。

使用示例:

import pandas as pd

# 基本用法 - 指定开始和结束日期
date_range_basic = pd.date_range(start='2020-01-01', end='2020-01-10')

# 指定频率 - 每天
date_range_daily = pd.date_range(start='2020-01-01', periods=7, freq='D')

# 指定频率 - 每月开始
date_range_monthly_start = pd.date_range(start='2020-01-01', periods=6, freq='MS')

# 附加选项 - 时区指定
date_range_with_tz = pd.date_range(start='2020-01-01', periods=10, tz='Asia/Tokyo')

# 示例 5: 结合实际数据使用
dates_for_df = pd.date_range(start='2021-01-01', periods=6, freq='D')
data_df = pd.DataFrame({'value': [10, 20, 30, 40, 50, 60]}, index=dates_for_df)

# 打印结果
print("基本用法:\n", date_range_basic)
print("\n每天:\n", date_range_daily)
print("\n每月开始:\n", date_range_monthly_start)
print("\n时区指定:\n", date_range_with_tz)
print("\n结合数据使用的 DataFrame:\n", data_df)

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()

3、日期时间的处理和转换

Python Pandas 时间序列分析经常涉及到对日期和时间的处理与转换。日期和时间处理和转换是时间序列分析的基础。在时间序列分析中,日期和时间是最重要的维度,因为它可以帮助我们理解数据的变化趋势。Pandas提供了一系列强大的工具和方法来处理这些类型的数据,从而简化了日期和时间的分析和操作过程。通过正确的日期和时间处理和转换,我们可以更好地理解数据,并进行更深入的分析和可视化。

参考文档:Python Pandas 时间序列分析 日期时间的处理和转换

推荐文档