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