我有以下数据包含在一个DataFrame中,它是自定义类的一部分,我想计算它在夜间的统计数据。
LAeq,T LAFmax,T LA90,T
Start date & time
2021-08-18 22:00:00 71.5 90.4 49.5
2021-08-18 22:15:00 70.6 94.0 45.7
2021-08-18 22:30:00 69.3 82.2 48.3
2021-08-18 22:45:00 70.1 89.9 46.4
2021-08-18 23:00:00 68.9 82.4 46.0
... ... ...
2021-08-24 08:30:00 72.3 85.0 61.3
2021-08-24 08:45:00 72.9 84.6 62.2
2021-08-24 09:00:00 73.1 86.1 62.6
2021-08-24 09:15:00 72.8 86.4 61.6
2021-08-24 09:30:00 73.2 93.5 61.5
例如,我想找到每个给定夜间时段的第n个最高LAFmax T。
夜间时段通常为23:00至07:00,我已经使用resample()
方法实现了我的目标,如下所示。
def compute_nth_lmax(self, n):
nth_lmax = self.df["LAFmax,T"].between_time(self._night_start, self._day_start,
include_start=True, include_end=False).resample(
rule=self._night_length, offset=pd.Timedelta(self._night_start)).apply(
lambda x: (np.sort(x))[-n] if x.size > 0 else np.nan).dropna()
return nth_lmax
问题在于,resample()假设定期重新采样,当夜间时段为8小时时,这很好,因此将24平均细分(如默认情况下的23:00到07:00),但不适用于不规则的夜间时段(例如,如果我将其扩展到22:00到07:00)。
我已经尝试过使用groupby()
来完成这个,但是没有运气。
我唯一能想到的就是添加另一列,将每一行标记为"夜间1","夜间2"。等等,并按这些分组,但感觉相当混乱。
我决定采用我认为稍微不太优雅的方法,创建一个单独的列来标记夜间时段,然后再处理它们。尽管如此,我还是设法在两行代码中实现了我的目标。
self.df["Night-time indices"] = (self.df.index - pd.Timedelta(self._day_start)).date
nth_event = self.df.sort_values(by=[col], ascending=False).between_time(self._night_start, self._day_start)[
[col, period]].groupby(by=period).nth(n)
Out[43]:
Night-time indices
2021-08-18 100.0
2021-08-19 96.9
2021-08-20 97.7
2021-08-21 95.5
2021-08-22 101.7
2021-08-23 92.7
2021-08-24 85.8
Name: LAFmax,T, dtype: float64