Pandas 时间序列处理
说明: 请回答以下问题,以展示您对 pandas 中时间序列处理的全面理解。请在适用时提供代码示例。
问题 1
如何将日期字符串列表 ['2023-01-01', '2023-01-02', '2023-01-03']
转换为 pandas 的 DatetimeIndex
?
问题 2
给定一个以日期时间为索引的 DataFrame df
,如何重采样(resample)数据以获得每个月的平均值?
问题 3
描述在 pandas 中如何处理时区。请提供一个将朴素(naive)日期时间索引转换为特定时区的示例。
问题 4
pd.Timestamp
、pd.DatetimeIndex
和 pd.Period
之间有什么区别?请提供示例。
问题 5
如何创建一个以 2023 年 1 月份的工作日为索引的时间序列 DataFrame?
问题 6
解释如何使用滚动窗口(rolling window)计算时间序列的 7 天移动平均值。
问题 7
DataFrame df
包含不规则的时间戳数据,存在缺失日期。如何重新索引 df
以包含范围内的所有日期,并将缺失值填充为 NaN?
问题 8
解释在时间序列分析中 shift()
函数的用途。请提供一个使用它来计算当前值与前一天值差异的示例。
问题 9
在 pandas 时间序列中如何处理夏令时(Daylight Saving Time)转换?
问题 10
提供一个代码示例,将时间序列数据按周分组,并计算每周某一列的总和。
问题 11
解释 pandas 中 asfreq()
方法的使用。它与重采样(resampling)有何不同?
问题 12
date_range()
函数的用途是什么?如何使用它生成以小时为频率的时间序列?
问题 13
如何使用 pandas 内置的绘图功能绘制时间序列 DataFrame df
?
问题 14
解释如何使用基于时间的方法插值(interpolate)时间序列中的缺失值。
问题 15
给定格式不同的时间戳字符串,例如 '01/02/2023 14:30'
,如何将这些字符串解析为 pandas 的日期时间格式?
Pandas 时间序列处理 - 答案
问题 1
将日期字符串列表转换为 DatetimeIndex
:
import pandas as pddate_strings = ['2023-01-01', '2023-01-02', '2023-01-03']
datetime_index = pd.to_datetime(date_strings)
问题 2
重采样数据以获得每个月的平均值:
monthly_avg = df.resample('M').mean()
问题 3
在 pandas 中处理时区可以使用 tz_localize
和 tz_convert
方法:
# 假设 df 具有没有时区信息的日期时间索引
df = df.tz_localize('UTC') # 设置时区为 UTC
df = df.tz_convert('Asia/Shanghai') # 转换为上海时间
问题 4
-
pd.Timestamp
:表示单个时间戳。timestamp = pd.Timestamp('2023-01-01')
-
pd.DatetimeIndex
:由时间戳组成的索引。datetime_index = pd.DatetimeIndex(['2023-01-01', '2023-01-02'])
-
pd.Period
:表示时间段(例如,一个月,一年)。period = pd.Period('2023-01', freq='M')
问题 5
创建以 2023 年 1 月的工作日为索引的 DataFrame:
dates = pd.date_range(start='2023-01-01', end='2023-01-31', freq='B')
df = pd.DataFrame(index=dates)
问题 6
计算时间序列的 7 天移动平均值:
df['7_day_avg'] = df['value_column'].rolling(window=7).mean()
问题 7
重新索引 df
以包含所有日期:
full_index = pd.date_range(start=df.index.min(), end=df.index.max(), freq='D')
df = df.reindex(full_index)
问题 8
shift()
函数用于按指定的周期数移动数据:
df['diff'] = df['value'] - df['value'].shift(1)
问题 9
pandas 使用带有时区信息的日期时间索引来处理夏令时转换。在转换时区时,pandas 会自动调整时间戳:
df = df.tz_localize('UTC').tz_convert('Europe/Berlin')
问题 10
按周分组并计算某一列的总和:
weekly_sum = df.resample('W').sum()
问题 11
asfreq()
方法用于将数据转换为指定频率,而不进行聚合,只是重新索引。与 resample()
不同,asfreq()
不会对数据进行计算:
df_asfreq = df.asfreq('D')
问题 12
date_range()
用于生成一系列日期时间:
hourly_dates = pd.date_range(start='2023-01-01', end='2023-01-02', freq='H')
问题 13
使用 pandas 内置的绘图功能绘制时间序列:
df.plot()
问题 14
使用基于时间的插值方法填充缺失值:
df.interpolate(method='time', inplace=True)
问题 15
解析自定义格式的日期字符串:
date_strings = ['01/02/2023 14:30']
dates = pd.to_datetime(date_strings, format='%d/%m/%Y %H:%M')