Python Pandas - 日期功能
Pandas - 日期与时间功能
Section titled “Pandas - 日期与时间功能”Pandas 非常擅长处理时间序列数据(time series data),这在金融、经济和数据日志等领域至关重要。其核心功能包括生成日期和时间序列、转换频率以及执行基于时间的操作。
- 生成日期和时间戳(timestamps)序列。
- 将时间序列数据转换为不同的频率(frequencies)(例如,从每日转换为每月)。
- 处理时区(time zones)和日期偏移(date offsets)。
- 执行基于时间的索引和选择(indexing and selection)。
创建日期范围:pd.date_range()
Section titled “创建日期范围:pd.date_range()”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)
Section titled “更改日期频率(freq)”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 calculationmonthly_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, 2023business_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 pdfrom 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')常用频率偏移别名
Section titled “常用频率偏移别名”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 文档。