我有一个数据框,其中一列是datetime64[ns]
,其他值列。
e.g。
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
答案 0 :(得分:2)
您可以将副本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
然后,您可以使用此结果使用myseries
方法更新pd.Series.update
,这将覆盖索引匹配的NaN
中的myseries
值。以下是一步到位:
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
答案 1 :(得分:1)
您可以使用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