时间序列频率转换
pandas.Series.dt.floor
时间列向下取整
pandas.DataFrame.set_index
pandas.DataFrame.set_index()
是 Pandas 中用于将指定列设置为 DataFrame 新索引的方法。以下是它的核心作用、使用场景和具体示例:
1. 核心作用
- 改变索引:将一列或多列数据转换为行索引(替换默认的0-based数字索引)。
- 提升查询效率:索引列的数据会被优化存储,加速后续的
loc
、iloc
等基于索引的操作。 - 时间序列处理:特别适合将时间列设为索引,方便时间相关的重采样(
resample
)和滑动窗口(rolling
)操作。
2. 主要参数
参数 | 说明 |
---|---|
keys | 要设为索引的列名(单列或多列) |
drop=True | 是否从数据列中移除已被设为索引的列(默认True ,即移除) |
append=False | 是否保留原有索引并追加新索引(默认False ,即替换) |
inplace=False | 是否直接修改原DataFrame(默认False ,返回新对象) |
3. 使用示例
示例数据准备
import pandas as pd
df = pd.DataFrame({
'date': ['2023-01-01', '2023-01-02', '2023-01-03'],
'city': ['Beijing', 'Shanghai', 'Guangzhou'],
'temperature': [25, 28, 30]
})
print("原始DataFrame:")
print(df)
输出:
date city temperature
0 2023-01-01 Beijing 25
1 2023-01-02 Shanghai 28
2 2023-01-03 Guangzhou 30
场景1:将单列设为索引
# 将date列设为索引(默认会移除该列)
df_date_index = df.set_index('date')
print("\n设置date为索引后的结果:")
print(df_date_index)
输出:
city temperature
date
2023-01-01 Beijing 25
2023-01-02 Shanghai 28
2023-01-03 Guangzhou 30
场景2:保留原列并设置多级索引
# 将date和city设为多级索引(保留原列)
df_multi_index = df.set_index(['date', 'city'], drop=False)
print("\n多级索引结果:")
print(df_multi_index)
输出:
date city temperature
date city
2023-01-01 Beijing 2023-01-01 Beijing 25
2023-01-02 Shanghai 2023-01-02 Shanghai 28
2023-01-03 Guangzhou 2023-01-03 Guangzhou 30
场景3:时间序列处理(关键用途)
# 将时间列转为DatetimeIndex后设为索引
df['date'] = pd.to_datetime(df['date'])
df_time_index = df.set_index('date')
# 现在可以方便地进行时间相关操作
print("\n按月份求平均温度:")
print(df_time_index['temperature'].resample('M').mean())
输出:
date
2023-01-31 27.666667
Freq: M, Name: temperature, dtype: float64
4. 注意事项
- 索引唯一性:设为索引的列应具有唯一值,否则可能影响查询性能。
- 检查重复值:
df.duplicated(subset=['待设索引列']).sum()
- 检查重复值:
- 不可变特性:索引一旦设定,不能直接修改(需通过
reset_index()
还原后重新设置)。 - 查询优化:对于大表,设置索引后使用
loc
比iloc
更高效:# 快速查询特定日期的数据 df_time_index.loc['2023-01-01']
5. 实际应用场景
场景 | 操作示例 | 优势 |
---|---|---|
时间序列分析 | df.set_index(pd.to_datetime(df['date'])) | 支持resample 、rolling |
多维度数据分析 | set_index(['region', 'year']) | 方便groupby 多层聚合 |
快速行列转换 | 结合unstack() 使用 | 生成透视表结构 |
加速特定列查询 | 对高频查询列设索引 | 提升loc 查询速度 |
总结
- 核心作用:将数据列转换为索引,优化数据结构和查询效率。
- 时间序列必用:设为时间索引后,才能使用Pandas强大的时间序列功能。
- 多级索引:适合处理多维数据分析(如地区-时间双重维度)。
通过合理使用set_index()
,可以显著提升数据操作的效率和代码可读性。
pandas.DataFrame.resample 重采样
时间序列频率转换和重采样的便捷方法。对象必须具有日期时间类型的索引(如 DatetimeIndex
、PeriodIndex
或 TimedeltaIndex
),或者调用者需通过 on
/level
关键字参数传递日期时间类型数据列/索引的标签。
关键术语解释
-
frequency conversion
- 频率转换:指将时间序列数据的时间间隔从一种频率调整为另一种频率(例如从分钟级调整为小时级)。
-
resampling
- 重采样:对时间序列数据进行重新采样,通常用于聚合或调整时间粒度(如按小时求和、按天平均等)。
-
datetime-like index
- 日期时间类型的索引:Pandas 中用于表示时间的索引类型,包括:
DatetimeIndex
:标准的日期时间索引(如2023-01-01 00:00:00
)。PeriodIndex
:表示时间周期的索引(如2023Q1
表示第一季度)。TimedeltaIndex
:表示时间间隔的索引(如1 day
,2 hours
)。
- 日期时间类型的索引:Pandas 中用于表示时间的索引类型,包括:
-
on/level 参数
- 如果数据的日期时间信息存储在某一列(而非索引)中,可以通过
on
参数指定该列的名称;在多级索引(MultiIndex)中,可通过level
参数指定时间所在的层级。
- 如果数据的日期时间信息存储在某一列(而非索引)中,可以通过
示例用法
import pandas as pd
# 示例数据:每分钟的温度数据
data = {
'timestamp': pd.date_range(start='2023-01-01', periods=6, freq='T'), # T 表示分钟
'temperature': [20, 22, 21, 23, 24, 25]
}
df = pd.DataFrame(data)
# 将时间列设为索引
df.set_index('timestamp', inplace=True)
# 使用 resample 按小时聚合(频率转换为 H)
hourly_data = df.resample('H').mean() # 计算每小时的平均温度
print(hourly_data)
输出:
temperature
timestamp
2023-01-01 00:00:00 21.0 # 每小时的平均值(假设数据跨度不足一小时)
注意事项
- 如果数据的日期时间信息不在索引中,需通过
on
参数指定列名:df.resample('H', on='timestamp').mean()
- 对于多级索引,需通过
level
参数指定时间所在的层级:df.resample('H', level='time_index').mean()
希望这段翻译和解释对你理解 resample
方法有所帮助!