两个日期列之间的上采样
upsample between two date columns
我有以下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'])
并且我想获得该事件的持续时间以及每小时的开始和结束时间:例如
在我的虚拟 df 中,第 6 个小时应该是 60 分钟(每小时最多)- 00:10:06 = 00:49:54。第 7 和第 8 应该是 1:00:00,因为结束时间是 09:26:13。第 9 小时应该是 00:26:13 加上以下 .rows 中与第 9 小时重叠的所有间隔 09:44 - 09:41 = 3 分钟和 60 分钟 -00:56 =4 分钟。所以第 9 的总数应该是 26+ 3 +4~=00:32:28
我最初的方法是合并开始和结束,每 3 行添加虚拟点,上采样到 1S,获取行之间的差异,仅对实际行求和。必须有一种更 pythonic 的方式来做到这一点。任何提示都会很棒。
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]
我有以下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'])
并且我想获得该事件的持续时间以及每小时的开始和结束时间:例如
在我的虚拟 df 中,第 6 个小时应该是 60 分钟(每小时最多)- 00:10:06 = 00:49:54。第 7 和第 8 应该是 1:00:00,因为结束时间是 09:26:13。第 9 小时应该是 00:26:13 加上以下 .rows 中与第 9 小时重叠的所有间隔 09:44 - 09:41 = 3 分钟和 60 分钟 -00:56 =4 分钟。所以第 9 的总数应该是 26+ 3 +4~=00:32:28
我最初的方法是合并开始和结束,每 3 行添加虚拟点,上采样到 1S,获取行之间的差异,仅对实际行求和。必须有一种更 pythonic 的方式来做到这一点。任何提示都会很棒。
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]