根据时间频率和字符串列进行分组?

时间:2018-07-15 15:00:31

标签: python pandas group-by aggregate

我正在尝试根据时间和ID组合一组字符串,我希望从首次出现起每隔5分钟将数据分组。

数据:

const taskList = {
  "tasks": [
    {
      "name": "Task YES",
      "finished": false,
      "id": 1
    },
    {
      "name": "Task NO",
      "finished": false,
      "id": 2
    }
  ]
};

let someValue = 'Task NO';
let task = taskList.tasks.find(task => task.name === someValue);
console.log(task);

if (task) console.log(`Task with the ID of ${task.id} already has this name`);
else console.log("No task with that name was found");

所需结果:

ID |   Q   | Timestamp       |
1  | a > b | 24/06/2017 18:11|
1  | b > b | 24/06/2017 18:12|
1  | b > c | 24/06/2017 18:13|
1  | c > d | 24/06/2017 18:14|
1  | c > e | 24/06/2017 18:17|
2  | a > b | 24/06/2017 18:12|
2  | b > c | 24/06/2017 18:15|

我目前正在尝试使用此

ID |              Q               | Timestamp       |
1  | a > b > b > b > b > c > c > d| 24/06/2017 18:11|
1  | c > e                        | 24/06/2017 18:17|
2  | a > b > b > c                | 24/06/2017 18:12|

但是,这还不够,这打破了时间戳,无法按时间顺序加入。它似乎也只在第一个时间范围内执行。

任何帮助都非常有用。

1 个答案:

答案 0 :(得分:0)

您以5个月一次的频率分组:

5M = 5个月。

5min5T = 5分钟。

查看此time_aliases

如果您将以5T的频率执行此操作,则将获得分钟数的结果,该结果可以平均除以5(在这种情况下从18:10开始),例如:

ids = [*[1]*5, 2]
q = [f'{i:02}' for i in range(6)]
dates = pd.date_range('2017-06-24 18:11', periods=6, freq='1min')
df = pd.DataFrame({'ids':ids, 'q':q,'dates':dates,})
df
   ids   q               dates
0    1  00 2017-06-24 18:11:00
1    1  01 2017-06-24 18:12:00
2    1  02 2017-06-24 18:13:00
3    1  03 2017-06-24 18:14:00
4    1  04 2017-06-24 18:15:00
5    2  05 2017-06-24 18:16:00

频率为5分钟的分组可以为您

grouped = df.groupby([pd.Grouper(key='dates',freq='5min'), 'ids']).agg(lambda x: '>'.join(set(x)))
grouped

                                   q
dates               ids             
2017-06-24 18:10:00 1    02>03>01>00
2017-06-24 18:15:00 1             04
                    2             05

如果您希望18:11作为开始日期,则可以抵消数据,然后抵消:

df['dates'] -= pd.offsets.Minute(1)
grouped = df.groupby([pd.Grouper(key='dates',freq='5min'), 'ids']).agg(lambda x: '>'.join(set(x))).reset_index()
grouped['dates'] += pd.offsets.Minute(1)
grouped

                dates  ids               q
0 2017-06-24 18:11:00    1  04>00>03>02>01
1 2017-06-24 18:16:00    2              05

从而达到预期的结果。

一个更通用的答案是将最小日期偏移到可以用n除以最近的分钟数(在您的情况下为n=5,最小为18:11)。