Pandas 时间数据处理全面指南

python数据分析2026年6月7日2

Pandas 时间数据处理全面指南

1. 引言

时间序列数据是数据分析中最常见的数据类型之一,Pandas 提供了强大且灵活的时间序列处理功能。本文将全面介绍 Pandas 中的时间处理功能,包括时间数据的创建、转换、索引、重采样以及各种时间相关操作,通过实际代码示例展示如何使用这些功能。

2. 时间数据的创建

2.1 从字符串创建时间戳

import pandas as pd

# 从字符串创建Timestamp
timestamp = pd.to_datetime('2023-01-15 14:30:00')
print("创建的时间戳:", timestamp)

输出:

创建的时间戳: 2023-01-15 14:30:00

解释:

  • pd.to_datetime() 可以将多种格式的字符串转换为 Pandas 的 Timestamp 对象
  • 自动识别常见日期时间格式

2.2 创建时间范围

# 创建时间范围
date_range = pd.date_range('2023-01-01', periods=5, freq='D')
print("\n时间范围:\n", date_range)

输出:

时间范围:
 DatetimeIndex(['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-04',
               '2023-01-05'],
              dtype='datetime64[ns]', freq='D')

参数说明:

  • start: 开始日期
  • end/periods: 结束日期或周期数
  • freq: 频率('D'表示天,'H'表示小时等)

2.3 从多个字符串创建时间序列

# 从多个字符串创建DatetimeIndex
dates = ['2023-01-01', '2023-01-15', '2023-02-01']
datetime_index = pd.to_datetime(dates)
print("\nDatetimeIndex:\n", datetime_index)

3. 时间数据属性访问

3.1 访问时间组件

# 创建时间序列
ts = pd.Series(range(3), index=pd.date_range('2023-01-01', periods=3, freq='M'))

# 访问时间组件
print("\n年份:", ts.index.year)
print("月份:", ts.index.month)
print("日:", ts.index.day)
print("星期几:", ts.index.dayofweek)  # 周一=0, 周日=6
print("季度:", ts.index.quarter)

3.2 判断是否为特定日期

# 判断是否为月初
print("\n是否为月初:", ts.index.is_month_start)

4. 时间数据索引与切片

4.1 基本时间切片

# 创建较长的时间序列
long_ts = pd.Series(range(365), index=pd.date_range('2023-01-01', periods=365))

# 时间切片
print("\n一月份数据:\n", long_ts['2023-01'])
print("\n1月到3月数据:\n", long_ts['2023-01':'2023-03'])

4.2 部分字符串索引

# 部分字符串索引
print("\n所有1月15日的数据:\n", long_ts.loc['2023-01-15'])
print("\n所有1月份的数据:\n", long_ts.loc['2023-01'])

5. 时间偏移与移位

5.1 使用时间偏移

# 时间偏移
from pandas.tseries.offsets import Day, MonthEnd

print("\n原时间:", timestamp)
print("加1天:", timestamp + Day(1))
print("月末:", timestamp + MonthEnd(1))

5.2 时间序列移位

# 时间序列移位
print("\n原始时间序列:\n", ts)
print("\n向后移位2个月:\n", ts.shift(2, freq='M'))

6. 时间重采样

6.1 降采样(低频)

# 创建每分钟数据
minute_ts = pd.Series(range(120), index=pd.date_range('2023-01-01', periods=120, freq='T'))

# 降采样为每小时
hourly = minute_ts.resample('H').mean()
print("\n每小时均值:\n", hourly.head())

6.2 升采样(高频)

# 升采样并填充
upsampled = hourly.resample('30T').ffill()
print("\n升采样结果:\n", upsampled.head())

7. 时间窗口操作

7.1 滚动窗口

# 滚动平均值
rolling = long_ts.rolling(window=7).mean()
print("\n7天滚动平均值:\n", rolling.head(10))

7.2 扩展窗口

# 扩展窗口平均值
expanding = long_ts.expanding().mean()
print("\n扩展窗口平均值:\n", expanding.head(10))

8. 时区处理

8.1 本地化与时区转换

# 本地化并转换时区
ts = pd.date_range('2023-01-01', periods=3, freq='H')
ts_utc = ts.tz_localize('UTC')
print("\nUTC时间:", ts_utc)
print("\n转换为上海时间:", ts_utc.tz_convert('Asia/Shanghai'))

8.2 处理夏令时

# 夏令时示例
ts = pd.date_range('2023-03-12 00:00', periods=5, freq='H', tz='America/New_York')
print("\n夏令时转换:\n", ts)

9. 时间差处理

9.1 计算时间差

# 计算时间差
diff = pd.Timestamp('2023-01-15') - pd.Timestamp('2023-01-10')
print("\n时间差:", diff)
print("天数:", diff.days)

9.2 时间差序列

# 时间差序列
ts = pd.Series(pd.date_range('2023-01-01', periods=5, freq='D'))
deltas = ts.diff()
print("\n时间差序列:\n", deltas)

10. 实际应用案例

10.1 处理股票数据

# 模拟股票数据
stock_data = pd.DataFrame({
    'price': [100, 101, 102, 103, 104, 105],
    'volume': [1000, 1200, 800, 1500, 2000, 1800]
}, index=pd.date_range('2023-01-03', periods=6, freq='B'))  # B=工作日

# 计算5日移动平均
stock_data['5_day_ma'] = stock_data['price'].rolling(5).mean()
print("\n股票数据:\n", stock_data)

10.2 分析销售数据

# 模拟销售数据
sales = pd.Series([120, 135, 150, 110, 125, 140],
                 index=pd.to_datetime(['2023-01-01', '2023-01-02', '2023-01-03',
                                      '2023-02-01', '2023-02-02', '2023-02-03']))

# 按月汇总
monthly_sales = sales.resample('M').sum()
print("\n月度销售总额:\n", monthly_sales)

11. 总结

  1. 时间数据创建:

    • pd.to_datetime() 从字符串创建时间戳
    • pd.date_range() 创建规则的时间序列
    • 支持多种输入格式和时区设置
  2. 时间属性访问:

    • 轻松获取年、月、日、星期等时间组件
    • 支持判断特殊日期(如月初、月末等)
  3. 时间索引与切片:

    • 使用部分字符串进行灵活索引
    • 支持自然语言风格的时间范围选择
  4. 时间偏移与移位:

    • 使用DateOffset进行精确时间偏移
    • shift()方法移动时间序列
  5. 时间重采样:

    • resample()实现升采样和降采样
    • 支持多种聚合函数和填充方法
  6. 时间窗口操作:

    • rolling()计算滚动统计量
    • expanding()计算扩展窗口统计量
  7. 时区处理:

    • tz_localize()设置时区
    • tz_convert()转换时区
    • 自动处理夏令时
  8. 时间差处理:

    • 精确计算时间差
    • 支持时间差序列操作
  9. 实际应用:

    • 金融数据分析
    • 销售趋势分析
    • 任何时间序列数据处理

Pandas 的时间序列功能强大而全面,可以满足绝大多数时间数据处理需求。掌握这些功能可以让你更高效地处理和分析时间序列数据,从数据中提取有价值的洞察。

Pandas 时间差(timedelta)处理详解

12. 时间差(timedelta)处理

时间差(timedelta)表示两个时间点之间的差异,Pandas提供了强大的timedelta功能来处理持续时间或时间间隔。

12.1 创建时间差

# 创建timedelta
delta1 = pd.Timedelta('2 days 3 hours 15 minutes')
delta2 = pd.Timedelta(days=1, hours=5)
delta3 = pd.Timedelta(3, unit='D')  # 3天

print("时间差1:", delta1)
print("时间差2:", delta2)
print("时间差3:", delta3)

输出:

时间差1: 2 days 03:15:00
时间差2: 1 days 05:00:00
时间差3: 3 days 00:00:00

解释:

  • 可以从字符串、关键字参数或数值创建timedelta
  • 支持的单位: 'D'(天), 'h'(小时), 'm'(分钟), 's'(秒), 'ms'(毫秒), 'us'(微秒), 'ns'(纳秒)

12.2 时间差运算

# 时间差运算
start = pd.Timestamp('2023-01-10')
end = pd.Timestamp('2023-01-15')

# 计算时间差
duration = end - start
print("\n时间差:", duration)
print("天数:", duration.days)
print("秒数:", duration.total_seconds())

# 时间加减
new_date = start + pd.Timedelta('3 days')
print("\n3天后:", new_date)

12.3 时间差序列

# 创建时间差Series
td_series = pd.Series([pd.Timedelta(days=i) for i in range(5)])
print("\n时间差Series:\n", td_series)

# 时间差运算
print("\n加1天:\n", td_series + pd.Timedelta(days=1))
print("\n总时间差:", td_series.sum())

12.4 时间差与时间序列

# 创建时间序列
ts = pd.Series(range(5), index=pd.date_range('2023-01-01', periods=5))

# 计算时间间隔
intervals = ts.index.to_series().diff()
print("\n时间间隔:\n", intervals)

# 计算时间差统计信息
print("\n平均间隔:", intervals.mean())
print("最大间隔:", intervals.max())

12.5 时间差转换

# 时间差转换
delta = pd.Timedelta('1 days 6 hours 30 minutes')

print("\n转换为天:", delta / pd.Timedelta('1D'))
print("转换为小时:", delta / pd.Timedelta('1h'))
print("转换为分钟:", delta / pd.Timedelta('1m'))

12.6 实际应用案例

# 处理任务持续时间数据
tasks = pd.DataFrame({
    'start': pd.to_datetime(['2023-01-01 09:00', '2023-01-02 10:00', '2023-01-03 13:00']),
    'end': pd.to_datetime(['2023-01-01 11:30', '2023-01-02 15:45', '2023-01-03 18:15'])
})

# 计算持续时间
tasks['duration'] = tasks['end'] - tasks['start']
print("\n任务持续时间:\n", tasks)

# 分析持续时间
print("\n平均持续时间:", tasks['duration'].mean())
print("最短持续时间:", tasks['duration'].min())
print("最长持续时间:", tasks['duration'].max())

总结:

  1. 创建方式:

    • 可以从字符串、数值或组件创建timedelta
    • 支持多种时间单位
  2. 运算能力:

    • 支持与时间戳的加减运算
    • 支持时间差之间的加减比较
  3. 转换功能:

    • 可以转换为不同单位的时间差
    • 可以计算总秒数等绝对数值
  4. 实际应用:

    • 计算持续时间或间隔
    • 分析任务执行时间
    • 处理任何需要时间差概念的场景

timedelta功能使得时间间隔的计算和处理变得简单直观,是时间序列分析中不可或缺的工具。