
36. 时间序列基础1. 概述时间序列是按时间顺序排列的数据点。Pandas 提供了强大的时间序列处理功能包括日期范围生成、时间索引、日期提取等是金融、气象、销售等数据分析的基础。importpandasaspdimportnumpyasnpimportmatplotlib.pyplotasplt# 设置中文字体plt.rcParams[font.sans-serif][SimHei,Arial Unicode MS]plt.rcParams[axes.unicode_minus]False# 创建示例数据np.random.seed(42)2. 日期时间类型2.1 转换为 datetime 类型# 创建包含日期字符串的数据dfpd.DataFrame({日期:[2024-01-01,2024-01-02,2024-01-03,2024-01-04,2024-01-05],销售额:[100,150,120,180,200]})print(原始数据类型:)print(df.dtypes)# 转换为 datetime 类型df[日期]pd.to_datetime(df[日期])print(\n转换后数据类型:)print(df.dtypes)# 设置日期为索引df.set_index(日期,inplaceTrue)print(\n设置日期索引后:)print(df)2.2 多种日期格式解析# 不同格式的日期字符串date_stringspd.Series([2024-01-01,2024/01/02,01-03-2024,2024年01月04日,Jan 5, 2024])print(原始字符串:)print(date_strings)# 自动解析多种格式parsed_datespd.to_datetime(date_strings)print(\n解析后:)print(parsed_dates)3. 生成日期范围3.1 date_range() 基础# 按天生成dailypd.date_range(start2024-01-01,end2024-01-10,freqD)print(每日日期:)print(daily)# 按小时生成hourlypd.date_range(start2024-01-01,periods10,freqH)print(\n每小时日期:)print(hourly)# 按分钟生成minutelypd.date_range(start2024-01-01 09:00:00,periods10,freqT)print(\n每分钟日期:)print(minutely)3.2 常用频率代码代码说明示例D日历日freqDB工作日freqBH小时freqHT或min分钟freqTS秒freqSW周周日freqWW-MON周一freqW-MONM月末freqMMS月初freqMSQ季末freqQQS季初freqQSA年末freqAAS年初freqAS# 工作日business_dayspd.date_range(start2024-01-01,periods10,freqB)print(工作日:)print(business_days)# 每周一mondayspd.date_range(start2024-01-01,periods10,freqW-MON)print(\n每周一:)print(mondays)# 月末month_endpd.date_range(start2024-01-01,periods6,freqM)print(\n月末:)print(month_end)# 月初month_startpd.date_range(start2024-01-01,periods6,freqMS)print(\n月初:)print(month_start)4. DatetimeIndex 属性# 创建时间序列数据datespd.date_range(2024-01-01,periods30,freqD)tspd.Series(np.random.randn(30),indexdates)print(时间序列:)print(ts.head())# 提取日期各部分print(f\n年份:{ts.index.year})print(f月份:{ts.index.month})print(f日期:{ts.index.day})print(f星期几数字:{ts.index.dayofweek})print(f星期几名称:{ts.index.day_name()})print(f年中的第几天:{ts.index.dayofyear})print(f季度:{ts.index.quarter})print(f是否月末:{ts.index.is_month_end})print(f是否月初:{ts.index.is_month_start})5. 时间索引的选择# 创建时间序列datespd.date_range(2024-01-01,periods100,freqD)tspd.Series(np.random.randn(100),indexdates)# 按年份选择print(2024年数据:)print(ts[2024])# 按年月选择print(\n2024年1月数据:)print(ts[2024-01])# 按日期范围选择print(\n2024-01-15 到 2024-01-20:)print(ts[2024-01-15:2024-01-20])# 按年份范围选择print(\n2024年第一季度:)print(ts[2024-01:2024-03])6. 完整示例股票价格分析# 创建股票价格数据np.random.seed(42)datespd.date_range(2024-01-01,periods200,freqD)# 模拟股价随机游走returnsnp.random.normal(0.001,0.02,200)prices100*(1returns).cumprod()stockpd.DataFrame({收盘价:prices,成交量:np.random.randint(10000,100000,200),涨跌幅:returns*100},indexdates)print(*60)print(股票价格分析)print(*60)print(\n原始数据:)print(stock.head())print(f数据周期:{stock.index[0]}到{stock.index[-1]})# 1. 提取时间特征stock[年份]stock.index.year stock[月份]stock.index.month stock[星期]stock.index.day_name()stock[季度]stock.index.quarterprint(\n1. 添加时间特征:)print(stock.head())# 2. 按月统计print(\n2. 月度统计:)monthly_statsstock.resample(M).agg({收盘价:[mean,max,min],成交量:sum})print(monthly_stats.head())# 3. 按星期统计print(\n3. 各星期表现:)weekday_statsstock.groupby(星期)[涨跌幅].mean()print(weekday_stats)# 4. 季度收益print(\n4. 季度收益:)quarterly_returnsstock[收盘价].resample(Q).last().pct_change()*100print(quarterly_returns)7. 常见频率代码速查表代码说明别名D日历日dayB工作日businessH小时hourT分钟min,minuteS秒secondL毫秒msU微秒usW周weekM月末monthQ季末quarterA年末year8. 总结操作方法示例字符串转日期pd.to_datetime()pd.to_datetime(df[date])生成日期范围pd.date_range()pd.date_range(2024-01-01, periods10, freqD)设置日期索引df.set_index()df.set_index(date, inplaceTrue)提取年份dt.yeardf.index.year提取月份dt.monthdf.index.month提取星期dt.day_name()df.index.day_name()按年份选择df[2024]ts[2024]按年月选择df[2024-01]ts[2024-01]按范围选择df[start:end]ts[2024-01-01:2024-01-31]