创建稀疏的时差序列
Create sparse Series of time differences
我有一个数据框,其中一列是 datetime64[ns]
,其他列是值。
例如
df=
Date Value
0 2015-03-25 12:50:37.000000 9.4
1 2015-03-25 12:52:20.000000 5
2 2015-03-25 12:52:30.000000 8
我想填充另一个 pandas 系列,其中包含规则间隔的索引,如
myseries=pd.Series(index=pd.date_range(start=time_start, end=time_end, freq='1s',closed='left'))
本系列的内容应该是:
该时间戳的 df 中最后一个事件的时间
示例:
2015-03-25 12:50:37.000000 0 seconds
2015-03-25 12:50:38.000000 1 seconds
2015-03-25 12:50:39.000000 2 seconds
....
2015-03-25 12:52:19.000000 102 seconds
2015-03-25 12:52:20.000000 0 seconds
您可以将副本 Date
移动到您的索引(保留 Date
列,而不是删除它,使用参数 drop=False
),获取时差,并提取秒数有了这个:
df.set_index('Date', drop=False)['Date'].diff().apply(lambda x: x.seconds)
# Date
# 2015-03-25 12:50:37 NaN
# 2015-03-25 12:52:20 103.0
# 2015-03-25 12:52:30 10.0
然后您可以使用此结果通过 pd.Series.update
方法更新 myseries
,这将覆盖索引匹配的 myseries
中的 NaN
值。一步到位:
myseries.update(df.set_index('Date', drop=False)['Date'].diff().apply(lambda x: x.seconds)
# 2015-03-25 12:52:18 NaN
# 2015-03-25 12:52:19 NaN
# 2015-03-25 12:52:20 103.0
# 2015-03-25 12:52:21 NaN
您可以使用 date_range 重新索引,然后使用 cumsum 非 nan 值。通过结合使用 groupby 和 cumcount,您可以获得结果。我缩短了时间窗口的长度,以便更好地显示。
df
Date Value
0 2015-03-25 12:50:17 9.4
1 2015-03-25 12:50:20 5.0
2 2015-03-25 12:50:25 8.0
df = df.set_index(['Date'])
df = df.reindex(pd.date_range(start='2015-03-25 12:50:17', end='2015-03-25 12:50:25', freq='1s',closed='left'))
Value
2015-03-25 12:50:17 9.4
2015-03-25 12:50:18 NaN
2015-03-25 12:50:19 NaN
2015-03-25 12:50:20 5.0
2015-03-25 12:50:21 NaN
2015-03-25 12:50:22 NaN
2015-03-25 12:50:23 NaN
2015-03-25 12:50:24 NaN
2015-03-25 12:50:25 8.0
result = (~df['Value'].isnull()).cumsum()
result = result.groupby(result).cumcount()
2015-03-25 12:50:17 0
2015-03-25 12:50:18 1
2015-03-25 12:50:19 2
2015-03-25 12:50:20 0
2015-03-25 12:50:21 1
2015-03-25 12:50:22 2
2015-03-25 12:50:23 3
2015-03-25 12:50:24 4
2015-03-25 12:50:25 0
Freq: S, dtype: int64
我有一个数据框,其中一列是 datetime64[ns]
,其他列是值。
例如
df=
Date Value
0 2015-03-25 12:50:37.000000 9.4
1 2015-03-25 12:52:20.000000 5
2 2015-03-25 12:52:30.000000 8
我想填充另一个 pandas 系列,其中包含规则间隔的索引,如
myseries=pd.Series(index=pd.date_range(start=time_start, end=time_end, freq='1s',closed='left'))
本系列的内容应该是: 该时间戳的 df 中最后一个事件的时间
示例:
2015-03-25 12:50:37.000000 0 seconds
2015-03-25 12:50:38.000000 1 seconds
2015-03-25 12:50:39.000000 2 seconds
....
2015-03-25 12:52:19.000000 102 seconds
2015-03-25 12:52:20.000000 0 seconds
您可以将副本 Date
移动到您的索引(保留 Date
列,而不是删除它,使用参数 drop=False
),获取时差,并提取秒数有了这个:
df.set_index('Date', drop=False)['Date'].diff().apply(lambda x: x.seconds)
# Date
# 2015-03-25 12:50:37 NaN
# 2015-03-25 12:52:20 103.0
# 2015-03-25 12:52:30 10.0
然后您可以使用此结果通过 pd.Series.update
方法更新 myseries
,这将覆盖索引匹配的 myseries
中的 NaN
值。一步到位:
myseries.update(df.set_index('Date', drop=False)['Date'].diff().apply(lambda x: x.seconds)
# 2015-03-25 12:52:18 NaN
# 2015-03-25 12:52:19 NaN
# 2015-03-25 12:52:20 103.0
# 2015-03-25 12:52:21 NaN
您可以使用 date_range 重新索引,然后使用 cumsum 非 nan 值。通过结合使用 groupby 和 cumcount,您可以获得结果。我缩短了时间窗口的长度,以便更好地显示。
df
Date Value
0 2015-03-25 12:50:17 9.4
1 2015-03-25 12:50:20 5.0
2 2015-03-25 12:50:25 8.0
df = df.set_index(['Date'])
df = df.reindex(pd.date_range(start='2015-03-25 12:50:17', end='2015-03-25 12:50:25', freq='1s',closed='left'))
Value
2015-03-25 12:50:17 9.4
2015-03-25 12:50:18 NaN
2015-03-25 12:50:19 NaN
2015-03-25 12:50:20 5.0
2015-03-25 12:50:21 NaN
2015-03-25 12:50:22 NaN
2015-03-25 12:50:23 NaN
2015-03-25 12:50:24 NaN
2015-03-25 12:50:25 8.0
result = (~df['Value'].isnull()).cumsum()
result = result.groupby(result).cumcount()
2015-03-25 12:50:17 0
2015-03-25 12:50:18 1
2015-03-25 12:50:19 2
2015-03-25 12:50:20 0
2015-03-25 12:50:21 1
2015-03-25 12:50:22 2
2015-03-25 12:50:23 3
2015-03-25 12:50:24 4
2015-03-25 12:50:25 0
Freq: S, dtype: int64