创建稀疏的时差系列

时间:2018-01-09 11:00:17

标签: python pandas timedelta

我有一个数据框,其中一列是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

2 个答案:

答案 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