【问题标题】:Split DateTimeIndex data based on hour/minute/second根据小时/分钟/秒拆分 DateTimeIndex 数据
【发布时间】:2017-02-09 13:37:53
【问题描述】:

我有时间序列数据,我想根据小时、分钟或秒进行拆分。这通常是用户定义的。我想知道如何做到这一点。

例如,考虑以下情况:

test = pd.DataFrame({'TIME': pd.date_range(start='2016-09-30',
                                           freq='600s', periods=20)})
test['X'] = np.arange(20)

输出是:

    TIME                X
0   2016-09-30 00:00:00 0
1   2016-09-30 00:10:00 1
2   2016-09-30 00:20:00 2
3   2016-09-30 00:30:00 3
4   2016-09-30 00:40:00 4
5   2016-09-30 00:50:00 5
6   2016-09-30 01:00:00 6
7   2016-09-30 01:10:00 7
8   2016-09-30 01:20:00 8
9   2016-09-30 01:30:00 9
10  2016-09-30 01:40:00 10
11  2016-09-30 01:50:00 11
12  2016-09-30 02:00:00 12
13  2016-09-30 02:10:00 13
14  2016-09-30 02:20:00 14
15  2016-09-30 02:30:00 15
16  2016-09-30 02:40:00 16
17  2016-09-30 02:50:00 17
18  2016-09-30 03:00:00 18
19  2016-09-30 03:10:00 19

假设我想按小时拆分它。我希望将以下内容作为一个块,然后我可以将其保存到文件中。

    TIME                X
0   2016-09-30 00:00:00 0
1   2016-09-30 00:10:00 1
2   2016-09-30 00:20:00 2
3   2016-09-30 00:30:00 3
4   2016-09-30 00:40:00 4
5   2016-09-30 00:50:00 5

第二个块是:

    TIME                X
0   2016-09-30 01:00:00 6
1   2016-09-30 01:10:00 7
2   2016-09-30 01:20:00 8
3   2016-09-30 01:30:00 9
4   2016-09-30 01:40:00 10
5   2016-09-30 01:50:00 11

等等……

注意,我可以完全基于逻辑条件来做到这一点,例如,

 df[(df['TIME'] >= '2016-09-30 00:00:00') &
    (df['TIME'] <= '2016-09-30 00:50:00')]

然后重复....

但是如果我的采样发生变化怎么办?有没有办法创建一个掩码或其他需要更少代码且高效的东西?我有 10 GB 的数据。

【问题讨论】:

    标签: pandas datetimeindex


    【解决方案1】:

    您需要为此使用groupby,并且分组应该基于日期和时间:

    test['DATE'] = test['TIME'].dt.date
    test['HOUR'] = test['TIME'].dt.hour
    grp = test.groupby(['DATE', 'HOUR'])
    

    然后您可以遍历组并执行您想要的操作。

    例子:

    for key, df in grp:
        print(key, df)
    
    ((datetime.date(2016, 9, 30), 0),                  TIME  X        DATE  HOUR
    0 2016-09-30 00:00:00  0  2016-09-30     0
    1 2016-09-30 00:10:00  1  2016-09-30     0
    2 2016-09-30 00:20:00  2  2016-09-30     0
    3 2016-09-30 00:30:00  3  2016-09-30     0
    4 2016-09-30 00:40:00  4  2016-09-30     0
    5 2016-09-30 00:50:00  5  2016-09-30     0)
    
    
    ((datetime.date(2016, 9, 30), 1),                   TIME   X        DATE  HOUR
    6  2016-09-30 01:00:00   6  2016-09-30     1
    7  2016-09-30 01:10:00   7  2016-09-30     1
    8  2016-09-30 01:20:00   8  2016-09-30     1
    9  2016-09-30 01:30:00   9  2016-09-30     1
    10 2016-09-30 01:40:00  10  2016-09-30     1
    11 2016-09-30 01:50:00  11  2016-09-30     1)
    
    
    ((datetime.date(2016, 9, 30), 2),                   TIME   X        DATE  HOUR
    12 2016-09-30 02:00:00  12  2016-09-30     2
    13 2016-09-30 02:10:00  13  2016-09-30     2
    14 2016-09-30 02:20:00  14  2016-09-30     2
    15 2016-09-30 02:30:00  15  2016-09-30     2
    16 2016-09-30 02:40:00  16  2016-09-30     2
    17 2016-09-30 02:50:00  17  2016-09-30     2)
    
    
    ((datetime.date(2016, 9, 30), 3),                   TIME   X        DATE  HOUR
    18 2016-09-30 03:00:00  18  2016-09-30     3
    19 2016-09-30 03:10:00  19  2016-09-30     3)
    

    【讨论】:

      【解决方案2】:

      选项 1
      您可以按系列进行分组,而无需将它们放在要分组的对象中。

      test.groupby([test.TIME.dt.date,
                    test.TIME.dt.hour,
                    test.TIME.dt.minute,
                    test.TIME.dt.second]):
      

      选项 2
      使用pd.TimeGrouper

      test.set_index('TIME').groupby(pd.TimeGrouper('S'))  # Group by seconds
      test.set_index('TIME').groupby(pd.TimeGrouper('T'))  # Group by minutes
      test.set_index('TIME').groupby(pd.TimeGrouper('H'))  # Group by hours
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 2018-06-22
        • 2020-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多