两个日期列之间上采样

问题描述 投票:0回答:1

我有以下的DF

lst = [[1548828606206000000, 1548840373139000000],
 [1548841285708000000, 1548841458405000000],
 [1548842198276000000, 1548843109519000000],
 [1548844022821000000, 1548844934207000000],
 [1548845431090000000, 1548845539219000000],
 [1548845555332000000, 1548845846621000000],
 [1548847176147000000, 1548851020030000000],
 [1548851704053000000, 1548852256143000000],
 [1548852436514000000, 1548855900767000000],
 [1548856817770000000, 1548857162183000000],
 [1548858736931000000, 1548858979032000000]]

df = pd.DataFrame(lst,columns =['start','end'])
df['start'] = pd.to_datetime(df['start'])
df['end'] = pd.to_datetime(df['end'])

我想获得每小时开始和结束时间该事件的持续时间:例如enter image description here

在我的虚拟DF然后6小时应为60分钟(每小时最大) - 0时10分06秒=○点49分54秒。对于第七和第八应该是每个1:00:00作为结束时间是9时26分十三秒。对于9号应该是零点26分13秒加上所有的在下面.rows与第九小时重叠09:44间隔 - 09:41 = 3mins和60分钟-00:56 = 4分钟。因此总为第九应26+ 3 + 4〜= 00:32:28

我最初的apporach是合并的开始和结束,加上虚拟点每3排,上采样到1S,得到行之间的区别,概括起来只有实际行。必须有这样做的更pythonic的方法。任何暗示将是巨大的。

python pandas resampling
1个回答
1
投票

IIUC,是这样的:

df.apply(lambda x: pd.to_timedelta(pd.Series(1, index=pd.date_range(x.start, x.end, freq='S'))
                                     .groupby(pd.Grouper(freq='H')).count(), unit='S'), axis=1).sum()

输出:

2019-01-30 06:00:00   00:49:54
2019-01-30 07:00:00   01:00:00
2019-01-30 08:00:00   01:00:00
2019-01-30 09:00:00   00:32:28
2019-01-30 10:00:00   00:33:43
2019-01-30 11:00:00   00:40:24
2019-01-30 12:00:00   00:45:37
2019-01-30 13:00:00   00:45:01
2019-01-30 14:00:00   00:09:48
Freq: H, dtype: timedelta64[ns]

或者把它降到小时,尝试:

df.apply(lambda r: pd.to_timedelta(pd.Series(1, index=pd.date_range(r.start, r.end, freq='S'))
                                   .pipe(lambda x: x.groupby(x.index.hour).count()), unit='S'), axis=1)\
  .sum()

输出:

6    00:49:54
7    01:00:00
8    01:00:00
9    00:32:28
10   00:33:43
11   00:40:24
12   00:45:37
13   00:45:01
14   00:09:48
dtype: timedelta64[ns]
© www.soinside.com 2019 - 2024. All rights reserved.