如何在Python中实现R的指定时间筛选并创建时间序列(ts)对象
Python实现R中的日期筛选与时间序列创建
原R代码功能
以下是你在R中实现的逻辑:筛选2007、2008、2009年每周一20:01的记录,基于Sub_metering_3创建年度频率为52的时间序列并绘图。
## Subset to one observation per week on Mondays at 8:00pm for 2007, 2008 and 2009 house070809weekly <- filter(MultiYear1, weekdays == "monday" & hour == 20 & minute == 1) ## Create TS object with SubMeter3 tsSM3_070809weekly <- ts(house070809weekly$Sub_metering_3, frequency=52, start=c(2007,1)) ## Plot sub-meter 3 with autoplot autoplot(tsSM3_070809weekly)
数据样例
DateTime Date Time Sub_metering_1 Sub_metering_2 Sub_metering_3 year month week weekdays day hour minute 1 2006-12-16 17:24:00 2006-12-16 17:24:00 0 1 17 2006 12 50 sábado 16 17 24 2 2006-12-16 17:25:00 2006-12-16 17:25:00 0 1 16 2006 12 50 sábado 16 17 25 3 2006-12-16 17:26:00 2006-12-16 17:26:00 0 2 17 2006 12 50 sábado 16 17 26 4 2006-12-16 17:27:00 2006-12-16 17:27:00 0 1 17 2006 12 50 sábado 16 17 27 5 2006-12-16 17:28:00 2006-12-16 17:28:00 0 1 17 2006 12 50 sábado 16 17 28 6 2006-12-16 17:29:00 2006-12-16 17:29:00 0 2 17 2006 12 50 sábado 16 17 29 7 2006-12-16 17:30:00 2006-12-16 17:30:00 0 1 17 2006 12 50 sábado 16 17 30 8 2006-12-16 17:31:00 2006-12-16 17:31:00 0 1 17 2006 12 50 sábado 16 17 31 9 2006-12-16 17:32:00 2006-12-16 17:32:00 0 1 17 2006 12 50 sábado 16 17 32 10 2006-12-16 17:33:00 2006-12-16 17:33:00 0 2 16 2006 12 50 sábado 16 17 33 11 2006-12-16 17:34:00 2006-12-16 17:34:00 0 1 17 2006 12 50 sábado 16 17 34 12 2006-12-16 17:35:00 2006-12-16 17:35:00 0 1 17 2006 12 50 sábado 16 17 35
你的Python尝试代码
你尝试的代码无法实现精准筛选:
# time series: consumption measured by kitchen submeter ts = byDay["2009-09-01":].Sub_metering_1.copy() # set index frequency as daily ts = ts.asfreq("D") # plot time series fig, ax = plt.subplots(figsize= (14, 5)) ax = plt.plot(ts, linewidth= 0.75) ax = plt.title("Daily energy consumption of kitchen")
Python实现方案
1. 数据预处理
先确保DateTime列为datetime类型,若未转换则执行:
import pandas as pd import matplotlib.pyplot as plt # 假设你的数据框名为df df['DateTime'] = pd.to_datetime(df['DateTime'])
2. 精准筛选记录
利用pandas的dt属性匹配所有条件:
# 筛选2007-2009年、周一、20点01分的记录 house070809weekly = df[ (df['DateTime'].dt.year.isin([2007, 2008, 2009])) & (df['DateTime'].dt.weekday == 0) & # 0对应周一(周一到周日为0-6) (df['DateTime'].dt.hour == 20) & (df['DateTime'].dt.minute == 1) ]
注:如果数据中
weekdays列是西班牙语(样例中sábado为周六),也可以用df['weekdays'] == 'lunes'(西班牙语周一)替代dt.weekday == 0。
3. 创建时间序列对象
方式1:pandas Series(推荐,自带时间索引)
# 设置DateTime为索引,提取Sub_metering_3 tsSM3_070809weekly = house070809weekly.set_index('DateTime')['Sub_metering_3'] # 设定频率为每周一 tsSM3_070809weekly = tsSM3_070809weekly.asfreq('W-MON')
方式2:类R风格时间序列对象(基于statsmodels)
from statsmodels.tsa.tsatools import freq_to_period # 创建带周频率的序列 tsSM3_070809weekly = pd.Series( house070809weekly['Sub_metering_3'].values, index=pd.date_range( start=house070809weekly['DateTime'].min(), periods=len(house070809weekly), freq='W-MON' ) )
4. 绘制时间序列图
fig, ax = plt.subplots(figsize=(14, 5)) tsSM3_070809weekly.plot(ax=ax, linewidth=0.75) ax.set_title("Weekly Sub_metering_3 (Mondays at 20:01, 2007-2009)") plt.show()
内容的提问来源于stack exchange,提问作者Pedro Santiago Marín
相关产品推荐
相关产品推荐

