首页 > 解决方案 > 如何使用 python 在精确时间获取具有占用计数的数据集并返回具有每小时最大值的数据集?

问题描述

我想获取一个数据集,该数据集提供每 15 分钟在一个位置有多少人的计数(例如,21:45 在位置 A 有 13 人,在 21:30 在位置 A 有 29 人等),并且而是让数据集显示在任何小时内占用该位置的最大人数(例如,在 21:00 到 21:59 之间,位置 A 的最大占用人数为 33 - 是否发生最多 33 人并不重要21:00、21:15、21:30 或 21:45)。

我的起点是一个看起来像这样的 csv(它有数千个条目,但这只是一个例子):

+--------------------+-------+-------+-------+-------+-------+-------+
|        TIME        | LOC A | LOC B | LOC C | LOC D | LOC E | LOC F |
+--------------------+-------+-------+-------+-------+-------+-------+
|                    |       |       |       |       |       |       |
| 8/28/2020 22:00:22 | 5     | 0     | 0     | 0     | 10    | 0     |
|                    |       |       |       |       |       |       |
| 8/28/2020 21:45:21 | 13    | 10    | 23    | 14    | 24    | 0     |
|                    |       |       |       |       |       |       |
| 8/28/2020 21:30:22 | 29    | 13    | 31    | 26    | 35    | 7     |
|                    |       |       |       |       |       |       |
| 8/28/2020 21:15:22 | 32    | 17    | 41    | 32    | 49    | 12    |
|                    |       |       |       |       |       |       |
| 8/28/2020 21:00:22 | 33    | 24    | 50    | 43    | 64    | 15    |
|                    |       |       |       |       |       |       |
| 8/28/2020 20:45:23 | 44    | 31    | 60    | 47    | 88    | 15    |
|                    |       |       |       |       |       |       |
| 8/28/2020 20:30:22 | 48    | 36    | 70    | 48    | 120   | 25    |
|                    |       |       |       |       |       |       |
| 8/28/2020 20:15:23 | 48    | 42    | 82    | 57    | 124   | 26    |
+--------------------+-------+-------+-------+-------+-------+-------+

为了确认,列中的值是在那个精确时间出现在那个位置的人数。

我的目标是这样的:

+--------------------+-------+-------+-------+-------+-------+-------+
|        TIME        | LOC A | LOC B | LOC C | LOC D | LOC E | LOC F |
+--------------------+-------+-------+-------+-------+-------+-------+
|                    |       |       |       |       |       |       |
| 2020-08-28 22:00   | 5     | 0     | 0     | 0     | 10    | 0     |
|                    |       |       |       |       |       |       |
| 2020-08-28 21:00   | 33    | 24    | 50    | 43    | 64    | 15    |
|                    |       |       |       |       |       |       |
| 2020-08-28 20:00   | 48    | 42    | 82    | 57    | 124   | 26    |
+--------------------+-------+-------+-------+-------+-------+-------+

因此,例如,如果 14:00、14:15、14:30 和 14:45 的位置计数分别为 5、7、12、6,则该位置的新条目将仅显示 14: 00 和 12 的值(因为那是那个时期的最大人数)。

我希望我已经解释过了。我对 python 还是很陌生,我完全有信心可以做到这一点,我只是不太知道怎么做。

任何帮助将不胜感激 - 非常感谢提前ʕ •ᴥ•ʔ</p>

标签: pythonpandasdatetimedata-cleaning

解决方案


您可以在索引上使用 groupby 来解决问题:

import pandas as pd

df = pd.DataFrame([{'Time':'2020-01-01 21:15:00', 'LOCA':3,'LOCB':0},
                   {'Time':'2020-01-01 21:00:00', 'LOCA':4, 'LOCB':10},
                   {'Time':'2020-01-01 20:00:00', 'LOCA':3,'LOCB':1},
                   {'Time':'2020-01-01 20:03:00', 'LOCA':12, 'LOCB':0},
                   {'Time':'2020-01-05 21:15:00', 'LOCA':3,'LOCB':0}])

#df.set_index(df['Time'],inplace = True)
df.set_index('Time', inplace = True)   #That is the proper way to do it
df.index = pd.to_datetime(df.index)
#df.drop(['Time'], axis = 1, inplace = True)

df = df.groupby([df.index.date, df.index.hour]).max()

print(df)       

推荐阅读