Skip to content

Python Pandas - 日期功能

Pandas 非常擅长处理时间序列数据(time series data),这在金融、经济和数据日志等领域至关重要。其核心功能包括生成日期和时间序列、转换频率以及执行基于时间的操作。

  • 生成日期和时间戳(timestamps)序列。
  • 将时间序列数据转换为不同的频率(frequencies)(例如,从每日转换为每月)。
  • 处理时区(time zones)和日期偏移(date offsets)。
  • 执行基于时间的索引和选择(indexing and selection)。

pd.date_range() 函数是创建日期和时间序列(DatetimeIndex)的主要工具。你通常会指定一个开始日期(start)、一个结束日期(end)和/或周期数(periods),以及一个可选的频率(freq)。

语法通常涉及 start、end、periods 和 freq 的组合。

示例 1:指定开始日期和周期数(默认频率为每日 ‘D’)。

import pandas as pd
# Generate 5 dates starting from '2023-01-01'
date_index = pd.date_range('2023-01-01', periods=5)
print(date_index)

输出:

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

示例 2:指定开始日期和结束日期。

import pandas as pd
# Generate dates from start to end (inclusive)
date_index = pd.date_range(start='2023-03-01', end='2023-03-05')
print(date_index)

输出:

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

注意:Pandas 使用纳秒分辨率(datetime64[ns])来表示时间戳(timestamps)。

freq 参数允许你指定日期之间的间隔。常见的频率包括 ‘D’(每日)、‘B’(工作日)、‘W’(每周)、‘M’(月末)、‘MS’(月初)、‘Q’(季末)、‘A’(年末)、‘H’(每小时)、‘T’ 或 ‘min’(每分钟)、‘S’(每秒)。

示例:生成月末日期。

import pandas as pd
# Generate 5 month-end dates starting from 2023-01
# Note: '1/1/2023' sets the starting point for period calculation
monthly_index = pd.date_range('1/1/2023', periods=5, freq='M')
print(monthly_index)

输出:

DatetimeIndex(['2023-01-31', '2023-02-28', '2023-03-31', '2023-04-30',
'2023-05-31'],
dtype='datetime64[ns]', freq='M')

示例:生成工作日日期(不包括周末)。

import pandas as pd
# Generate business days between two dates
# Example: Friday March 3rd, 2023 to Thursday March 9th, 2023
business_days = pd.date_range(start='2023-03-03', end='2023-03-09', freq='B')
print(business_days)

输出:

DatetimeIndex(['2023-03-03', '2023-03-06', '2023-03-07', '2023-03-08',
'2023-03-09'],
dtype='datetime64[ns]', freq='B')

请注意,由于频率设置为 ‘B’(工作日),序列中排除了周六(3月4日)和周日(3月5日)。

bdate_range() - 工作日日期范围(旧版)

Section titled “bdate_range() - 工作日日期范围(旧版)”

Pandas 之前有一个单独的 bdate_range() 函数,专门用于生成工作日序列。虽然它可能仍然有效,但推荐且更灵活的方法是使用 pd.date_range() 并设置 freq='B'。

import pandas as pd
# Using date_range with freq='B' (Recommended)
business_days_recommended = pd.date_range('2023-01-01', periods=5, freq='B')
print("Recommended (date_range with freq='B'):")
print(business_days_recommended)
# Using bdate_range (Legacy)
try:
business_days_legacy = pd.bdate_range('2023-01-01', periods=5)
print("\nLegacy (bdate_range):")
print(business_days_legacy)
except AttributeError:
print("\npd.bdate_range might be deprecated or removed in this Pandas version.")

输出(可能因 Pandas 版本略有不同):

Recommended (date_range with freq='B'):
DatetimeIndex(['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06'],
dtype='datetime64[ns]', freq='B')
Legacy (bdate_range):
DatetimeIndex(['2023-01-02', '2023-01-03', '2023-01-04', '2023-01-05',
'2023-01-06'],
dtype='datetime64[ns]', freq='B')

注意:推荐使用 Python 标准库的 datetime 对象或 pd.Timestamp,而不是已弃用的 pd.datetime。

import pandas as pd
from datetime import datetime
start_dt = datetime(2023, 1, 1)
end_dt = pd.Timestamp('2023-01-05') # pd.Timestamp is often convenient
date_index = pd.date_range(start_dt, end_dt)
print(date_index)

输出:

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

Pandas 为许多常用的时间序列频率提供了字符串别名,用于 freq 参数:

别名描述别名描述
B工作日频率QS季度初频率
D日历日频率BQS工作季度初频率
W周频率(默认周日)A年度(年末)频率
W-MON周频率(周一)AS年度(年初)频率
M月末频率BA工作年度末频率
MS月初频率BAS工作年度初频率
BM工作月末频率BH工作小时频率(9-5点)
BMS工作月初频率H小时频率
Q季度末频率T / min分钟频率
BQ工作季度末频率S秒频率
L / ms毫秒U / us微秒
N纳秒

你也可以将这些别名与乘数结合使用,例如 ‘2H’ 表示每隔 2 小时,‘5D’ 表示每隔 5 天。有关频率字符串和偏移量对象的完整列表,请参阅 Pandas 文档。