You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:50:27