bounty将在5天后过期。回答此问题可获得+50声望奖励。dspractician希望引起更多人关注此问题。
我想为每个ID找到00:00:00之前的最早测量时间和00:00:00之后的最晚测量时间。这样我就可以选择最大重叠开始和结束时间。下面是示例数据:
import pandas as pd
# create sample dataframe
df = pd.DataFrame({'ID': [1,1,1,
2,2,2,
3,3,3],
'timestamp': ['2022-01-01 12:00:00', '2022-01-01 12:30:00', '2022-01-01 13:00:00',
'2022-01-01 12:02:00', '2022-01-01 12:22:00', '2022-01-01 12:42:00',
'2022-01-01 12:45:00', '2022-01-01 12:55:00', '2022-01-01 13:05:00'],
'VALUE1': [50, 80, 65,
61,83,63,
64,85,66],
'gender': ['m', 'm', 'm',
'f', 'f', 'f',
'm', 'm', 'm',],
'age': [7,7,7,
8,8,8,
6,6,6, ]
})
我的期望是在图片中找到T_start和T_end(同一天24小时测量)。然后,追加(如虚线)最后一次或第一次测量的相同值。请参考图纸,因为我对问题的措辞可能会混淆:x1c 0d1x
我拥有的:
| 识别号|值1|时间戳|性别|年龄|
| - ------|- ------|- ------|- ------|- ------|
| 1个|五十|2022年1月1日12时00分|米|七|
| 1个|八十|2022年1月1日12时30分|米|七|
| 1个|六十五|2022年1月1日13时00分|米|七|
| 第二章|六十一|2022年1月1日12:02:00|f级|八个|
| 第二章|八十三|2022年1月1日12时22分|f级|八个|
| 第二章|六十三|2022年1月1日12时42分|f级|八个|
| 三个|六十四|2022年1月1日12时45分|米|六个|
| 三个|八十五|2022年1月1日12时55分|米|六个|
| 三个|六十六|2022年1月1日13时05分|米|六个|
我的期望:
| 识别号|值1|时间戳|性别|年龄|
| - ------|- ------|- ------|- ------|- ------|
| 1个|五十|2022年1月1日12时00分|米|七|
| 1个|八十|2022年1月1日12时30分|米|七|
| 1个|六十五|2022年1月1日13时00分|米|七|
| 1个|上一个条目的值=65|2022年1月1日13时05分|米|七|
| 第二章|下一个条目的值=61|2022年1月1日12时00分|f级|八个|
| 第二章|六十一|2022年1月1日12:02:00|f级|八个|
| 第二章|八十三|2022年1月1日12时22分|f级|八个|
| 第二章|六十三|2022年1月1日12时42分|f级|八个|
| 第二章|上一个条目的值|2022年1月1日12时45分|f级|八个|
| 第二章|上一个条目的值|2022年1月1日12时55分|f级|八个|
| 第二章|上一个条目的值|2022年1月1日13时00分|f级|八个|
| 第二章|上一个条目的值|2022年1月1日13时05分|f级|八个|
| 三个|下一个条目的值|2022年1月1日12时00分|米|六个|
| 三个|下一个条目的值|2022年1月1日12:02:00|米|六个|
| 三个|下一个条目的值|2022年1月1日12时22分|米|六个|
| 三个|下一个条目的值=64|2022年1月1日12时42分|米|六个|
| 三个|六十四|2022年1月1日12时45分|米|六个|
| 三个|八十五|2022年1月1日12时55分|米|六个|
| 三个|六十六|2022年1月1日13时05分|米|六个|
2条答案
按热度按时间46qrfjad1#
溶液
下面的代码只使用panda函数而不使用循环来解决这个问题。
这将返回以下DataFrame:
如果不仅外部缺失值而且所有缺失值都应该用相邻值填充,则
df.groupby()
构造可以用df = df.ffill().bfill()
替换。在一个较旧的解决方案中,在下面的详细答案中,有一个针对
df.groupby()
对象的循环,而不是df.groupby().apply()
:长答案
数据框被透视,列是MultiIndex(以“ID”作为第2级):
如果我们想要填充所有缺失值而不仅仅是外部缺失值,这将允许轻松地interpolate或fill缺失值:
为了只填充外部时间跨度中的缺失值,我们还需要几行
现在我们唯一需要做的就是将DataFrame恢复到其原始形状:
这给了我们最终的DataFrame,其中时间戳是第二层:
要摆脱MultiIndex,我们可以使用
reset_index()
:为了绘制数据,我们可以使用Pandas内置的绘图功能或seaborn,这通常会产生稍微更好的绘图:
l7wslrjt2#
下面是使用Pandas Timestamp执行此操作的一种方法:
然后: