按时间窗口对数据框进行分区

0 投票
2 回答
31 浏览
提问于 2025-04-12 17:40

我有一个数据表,其中有一列是日期:

这里插入图片描述

我想根据时间把这个数据表分成三个小表:

  1. 00:00-12:00。
  2. 12:00-18:00。
  3. 18:00-24:00。

我该如何在不使用循环的情况下实现这个目标呢?

我可以通过对每个时间戳使用循环来实现这个功能,但这样做速度很慢。

可以通过以下方式生成一些示例数据:

df = pd.DataFrame(pd.date_range(start='2024-01-01', end='2024-01-10', freq='10min'))
df['data'] = np.random.randint(100, size=len(df))
df.columns = ['date', 'data']

2 个回答

1

你可以把标准化的日期减去,这样就能得到一个时间差,称为timedelta。然后你可以用cutgroupby来处理这些数据:

# ensure datetime
df['Date'] = pd.to_datetime(df['Date'])

# form bins, split groups
bins = ['0', '12h', '18h', '24h']
labels = [f'{bins[i]}-{bins[i+1]}' for i in range(len(bins)-1)]
out = dict(list(df.groupby(pd.cut(df['Date'].sub(df['Date'].dt.normalize()),
                                  [pd.Timedelta(x) for x in bins],
                                  labels=labels, include_lowest=True))))

输出结果:

{'0-12h':                     Date
          0    2023-01-01 00:00:00
          1    2023-01-01 00:10:00
          2    2023-01-01 00:20:00
          3    2023-01-01 00:30:00
          4    2023-01-01 00:40:00
          ...                  ...
          1221 2023-01-09 11:30:00
          1222 2023-01-09 11:40:00
          1223 2023-01-09 11:50:00
          1224 2023-01-09 12:00:00
          1296 2023-01-10 00:00:00
          
          [658 rows x 1 columns],
'12h-18h':                     Date
           73   2023-01-01 12:10:00
           74   2023-01-01 12:20:00
           75   2023-01-01 12:30:00
           76   2023-01-01 12:40:00
           77   2023-01-01 12:50:00
           ...                  ...
           1256 2023-01-09 17:20:00
           1257 2023-01-09 17:30:00
           1258 2023-01-09 17:40:00
           1259 2023-01-09 17:50:00
           1260 2023-01-09 18:00:00
           
           [324 rows x 1 columns],
'18h-24h':                     Date
           109  2023-01-01 18:10:00
           110  2023-01-01 18:20:00
           111  2023-01-01 18:30:00
           112  2023-01-01 18:40:00
           113  2023-01-01 18:50:00
           ...                  ...
           1291 2023-01-09 23:10:00
           1292 2023-01-09 23:20:00
           1293 2023-01-09 23:30:00
           1294 2023-01-09 23:40:00
           1295 2023-01-09 23:50:00
           
           [315 rows x 1 columns],
}

使用的输入数据:

df = pd.DataFrame({'Date': pd.date_range('2023-01-01', '2023-01-10', freq='10min')})
1

这里还有一个其他的选择。你可以使用pandas来过滤数据框,这样就能得到你想要的三个新数据框。我借用了@mozway的模拟输入,所以请给他们一些认可。

import pandas as pd

df = pd.DataFrame({'DateWithTime': pd.date_range('2023-01-01', '2023-01-10', freq='10min')})
df['Hour']= df['DateWithTime'].dt.hour
df1=df[df['Hour'].isin(range(0,13))]
df2=df[df['Hour'].isin(range(13,19))]
df3=df[df['Hour'].isin(range(19,25))]


display(df)
display(df1)
display(df2)
display(df3)

这里是原始的数据框和过滤后的数据框。

    DateWithTime    Hour
0   2023-01-01 00:00:00     0
1   2023-01-01 00:10:00     0
2   2023-01-01 00:20:00     0
3   2023-01-01 00:30:00     0
4   2023-01-01 00:40:00     0
...     ...     ...
1292    2023-01-09 23:20:00     23
1293    2023-01-09 23:30:00     23
1294    2023-01-09 23:40:00     23
1295    2023-01-09 23:50:00     23
1296    2023-01-10 00:00:00     0

1297 rows × 2 columns
    DateWithTime    Hour
0   2023-01-01 00:00:00     0
1   2023-01-01 00:10:00     0
2   2023-01-01 00:20:00     0
3   2023-01-01 00:30:00     0
4   2023-01-01 00:40:00     0
...     ...     ...
1226    2023-01-09 12:20:00     12
1227    2023-01-09 12:30:00     12
1228    2023-01-09 12:40:00     12
1229    2023-01-09 12:50:00     12
1296    2023-01-10 00:00:00     0

703 rows × 2 columns
    DateWithTime    Hour
78  2023-01-01 13:00:00     13
79  2023-01-01 13:10:00     13
80  2023-01-01 13:20:00     13
81  2023-01-01 13:30:00     13
82  2023-01-01 13:40:00     13
...     ...     ...
1261    2023-01-09 18:10:00     18
1262    2023-01-09 18:20:00     18
1263    2023-01-09 18:30:00     18
1264    2023-01-09 18:40:00     18
1265    2023-01-09 18:50:00     18

324 rows × 2 columns
    DateWithTime    Hour
114     2023-01-01 19:00:00     19
115     2023-01-01 19:10:00     19
116     2023-01-01 19:20:00     19
117     2023-01-01 19:30:00     19
118     2023-01-01 19:40:00     19
...     ...     ...
1291    2023-01-09 23:10:00     23
1292    2023-01-09 23:20:00     23
1293    2023-01-09 23:30:00     23
1294    2023-01-09 23:40:00     23
1295    2023-01-09 23:50:00     23

270 rows × 2 columns

撰写回答