【问题标题】:Python: Pandas Grouper( ) function timestamp selectionPython:Pandas Grouper() 函数时间戳选择
【发布时间】:2019-08-16 19:45:41
【问题描述】:

这是示例数据:

|  group |   unix_time |   
|    1   |  1565938335 |   # 6:52:15 AM
|    1   |  1565938350 |   # 6:52:30 AM
|    1   |  1565938390 |   # 6:53:10 AM

这是代码。

df['datetime'] = pd.to_datetime(df['unix_time'], unit='s')  #convert unix time to datetime
for g, t in df.groupby(['group', pd.Grouper(freq='60s', key='datetime')]):
    print(g, t)

以上代码将数据分为2组:

  • 第 1 组:第 1 行和第 2 行
  • 第 2 组:第 3 行

原因是,在 Grouper() 函数中,freq = '60s' 将从分钟开始(6:52:00, 6:53:00)开始计算,而不是6:52:15。 Grouper( ) 使用默认时间戳:

timestamp 6:52:00
timpstamp 6:53:00

但是,我想把它们放在同一个组中,只要时差在 60 秒以内(6:52:15 AM 和 6:53:10 AM 都在 60 秒以内)

我阅读了 Grouper 手册页,但似乎没有这样的选项。如何修改代码?

【问题讨论】:

  • 剩余数据的开始时间如何确定?
  • @zaraki:例如,假设在早上 6:53:15 之后有第 4 行(仍属于第 1 组),则它成为新的开始时间。也就是说,第 1-3 行是 1.1 组,第 4 行是 1.2 组

标签: python pandas


【解决方案1】:

我的选择是对 pandas 使用时间索引resample

=^..^=

import pandas as pd

df = pd.DataFrame({'group': [1,1,1,1], "time": [1565938335, 1565938350, 1565938394, 1565938395]})
df['datetime'] = pd.to_datetime(df['time'], unit='s')
df.index = df['datetime']
print(df)

for item in df['datetime'].resample('60s', kind='period'):
    print(item)

输入数据:

                     group        time            datetime
datetime                                                  
2019-08-16 06:52:15      1  1565938335 2019-08-16 06:52:15
2019-08-16 06:52:30      1  1565938350 2019-08-16 06:52:30
2019-08-16 06:53:14      1  1565938394 2019-08-16 06:53:14
2019-08-16 06:53:15      1  1565938395 2019-08-16 06:53:15

输出:

(Period('2019-08-16 06:52:15', '60S'), datetime
2019-08-16 06:52:15   2019-08-16 06:52:15
2019-08-16 06:52:30   2019-08-16 06:52:30
2019-08-16 06:53:14   2019-08-16 06:53:14
Name: datetime, dtype: datetime64[ns])

(Period('2019-08-16 06:53:15', '60S'), datetime
2019-08-16 06:53:15   2019-08-16 06:53:15
Name: datetime, dtype: datetime64[ns])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-01
    • 2018-04-17
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多