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提供了一系列强大的工具和方法来处理这些类型的数据,从而简化了日期和时间的分析和操作过程。通过正确的日期和时间处理和转换,我们可以更好地理解数据,并进行更深入的分析和可视化。