Python Pandas 时间序列分析 日期时间的处理和转换

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

1、日期和时间的创建

pd.date_range() 是处理时间序列数据时非常重要的函数。它用于生成具有特定频率的固定长度的 DatetimeIndex,适用于创建时间序列数据或作为 DataFrameSeries 的时间索引。使用pd.to_datetime()将字符串转换为日期时间对象。

1)pd.date_range()

参数说明:

参数

描述

start

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

end

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

periods

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

freq

时间点的频率,如 'D'(每天),'M'(月末),'H'(每小时)等。

tz

时区名称,用于本地化时间索引。

normalize

如果为 True,则时间部分将归一化到午夜。

name

生成的 DatetimeIndex 的名称。

closed

控制间隔的哪一端是闭合的,可选项包括 'left'、'right'。

使用示例:

import pandas as pd

# 生成指定开始和结束日期的每日时间序列
daily_range = pd.date_range(start='2024-01-01', end='2024-01-10', freq='D')
print("Daily Range:\n", daily_range)

# 生成固定数量的月末时间序列
monthly_range = pd.date_range(start='2024-01-01', periods=6, freq='M')
print("\nMonthly Range:\n", monthly_range)

# 生成每小时的时间序列,并指定时区
hourly_range = pd.date_range(start='2024-01-01', periods=24, freq='H', tz='Asia/Tokyo')
print("\nHourly Range (Tokyo TZ):\n", hourly_range)

# 生成归一化到午夜的每周时间序列
weekly_range = pd.date_range(start='2024-01-01', periods=4, freq='W', normalize=True)
print("\nWeekly Range (Normalized):\n", weekly_range)

# 生成具有指定名称的季度末时间序列
quarterly_range = pd.date_range(start='2024-01-01', periods=4, freq='Q', name='Quarter End')
print("\nQuarterly Range:\n", quarterly_range)

2)pd.to_datetime()

pd.to_datetime()是处理和转换日期时间数据的重要工具。它可以将多种格式的数据转换为 Pandas 的 datetime 类型。

参考说明:

参数

描述

arg

要转换的日期时间数据。

可以是单个字符串、数字、列表、Series 或 DataFrame。

errors

如何处理错误。'ignore' 忽略错误,

'raise' 抛出错误,'coerce' 将错误设置为 NaT。

format

指定解析日期时间的格式(如 '%Y-%m-%d')。

unit

指定时间戳单位(如 's' 表示秒)。

使用示例:

import pandas as pd

# 将字符串转换为日期时间
datetime_from_str = pd.to_datetime('2024-01-01')
print("Datetime from string:", datetime_from_str)

# 将 UNIX 时间戳转换为日期时间
datetime_from_timestamp = pd.to_datetime(1609459200, unit='s')
print("Datetime from timestamp:", datetime_from_timestamp)

# 处理 DataFrame 中的日期时间列
df = pd.DataFrame({'date': ['2024-01-01', '2024-02-01', 'not a date']})
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print("\nDataFrame with Datetime:\n", df)

# 使用自定义日期时间格式
datetime_custom_format = pd.to_datetime('01-01-2024', format='%d-%m-%Y')
print("Datetime with custom format:", datetime_custom_format)

2、 提取日期和时间的组成部分

可以从日期时间对象中提取年份、月份、日等信息。

import pandas as pd
import numpy as np


dates = pd.date_range('20230101', periods=6)


# 提取日期时间的组成部分
year = dates.year
month = dates.month
day = dates.day

# 提取小时
# dates.hour
# 提取分钟
# dates.minute
# 提取秒
# dates.second
# 提取微秒
# dates.microsecond

print("年:", year)
print("月:", month)
print("日:", day)

3、日期和时间的算术运算

进行时间序列分析时,日期和时间的算术运算是一个重要的特性。

import pandas as pd

# 日期加减
date_plus_10_days = pd.Timestamp('2024-01-01') + pd.Timedelta(days=10)
print("Date plus 10 days:", date_plus_10_days)

# 时间差
time_difference = pd.Timestamp('2024-01-11') - pd.Timestamp('2024-01-01')
print("Time difference:", time_difference)

# 时间偏移
next_month_end = pd.Timestamp('2024-01-01') + pd.offsets.MonthEnd()
print("Next month end:", next_month_end)

# 创建时间序列数据
series = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 
                   index=pd.date_range('2024-01-01', periods=10))

# 数据向后移动
shifted_series = series.shift(periods=1)
print("\nShifted Series:\n", shifted_series)

# 计算滑动窗口平均值
rolling_avg = series.rolling(window=5).mean()
print("\nRolling Window Average:\n", rolling_avg)

4、时区处理

将时间数据本地化到特定的时区,以及在不同时区之间进行转换。这在处理跨越多个地理位置的数据时特别有用。

import pandas as pd

# 创建时间序列
ts = pd.Series(pd.date_range('2021-01-01', periods=3, freq='H'))

# 本地化到 UTC 时区
ts_localized = ts.dt.tz_localize('UTC')
print("Localized to UTC:\n", ts_localized)

# 转换到中国上海时区
ts_converted = ts_localized.dt.tz_convert("Asia/Shanghai")
print("\nConverted to Asia/Shanghai:\n", ts_converted)

5、时间序列的重采样

时间序列的重采样(Resampling)是一种改变时间序列数据频率的常用技术。它可以是降采样(减少数据点,如从日到月)或升采样(增加数据点,如从月到日)。重采样通常用于聚合数据或使数据符合特定的时间频率。

参数说明:

参数

描述

rule

重采样频率,如 'D'(天)、'M'(月)、'A'(年)等。

axis

应用重采样的轴。

closed

在降采样中,定义区间的闭合端。

label

在降采样中,如何标记聚合结果的时间标签。

convention

当重采样时期索引时,用于确定时期的约定。

kind

聚合到时间戳('timestamp')还是时期('period')。

loffset

对结果索引的偏移量。

base

对于每个时间窗口,基时间的偏移量。

on

在 DataFrame 上,用于重采样的列。

level

在多级索引的特定级别上重采样。

使用示例:

import pandas as pd

# 创建日数据
daily_data = pd.Series(range(30), index=pd.date_range('2024-01-01', periods=30, freq='D'))

# 降采样:将日数据转换为月数据
monthly_data_downsampled = daily_data.resample('M').mean()  # 以月为单位计算平均值
print("Monthly Data (Downsampled):\n", monthly_data_downsampled)

# 创建月数据
monthly_data = pd.Series(range(3), index=pd.date_range('2024-01-01', periods=3, freq='M'))

# 升采样:将月数据转换为日数据
daily_data_upsampled = monthly_data.resample('D').asfreq()  # 转换为每日频率,空值填充为 NaN
print("\nDaily Data (Upsampled):\n", daily_data_upsampled)

推荐阅读
cjavapy编程之路首页