使用pandas向前填充时间戳列并使用特定值(1秒)。

3

I have a pandas.Series like:

Timestamp_data:
0   2018-09-26 04:38:32.544 
1   NaT
2   NaT
3   NaT
4   2018-09-26 04:58:32.544
5   NaT

我想要对前一个可用时间点之后的每个 NaT(Not a Time)增加 1 秒:

    Timestamp_data:
0   2018-09-26 04:38:32.544 
1   2018-09-26 04:39:32.544
2   2018-09-26 04:40:32.544
3   2018-09-26 04:41:32.544
4   2018-09-26 04:58:32.544
5   2018-09-26 04:59:32.544

有这样一篇文章:

如何通过在 Pandas 中将 x 添加到前一行来填充 NA 值

但是在当前的 numpy 版本中,np.diff() 对布尔值会产生 TypeError。


我的解决方案可行吗?你想加一分钟还是一秒钟? - jezrael
1
完美,谢谢! :) - cincin21
1个回答

2
你可以使用cumcountto_timedelta为连续缺失的日期创建时间差,因为只有筛选这些行才会添加reindex以填充现有数据的0 timedelta
最后,向前填充NaT并添加新的Series:
print (df)
           Timestamp_data
0 2018-09-26 04:25:32.544
1 2018-09-26 04:38:32.544
2                     NaT
3                     NaT
4                     NaT
5 2018-09-26 04:58:32.544
6                     NaT

m = df['Timestamp_data'].notna()
#old pandas alternative
#m = df['Timestamp_data'].notnull()

s = (pd.to_timedelta(df[~m].groupby(m.cumsum()).cumcount() + 1, unit='s')
       .reindex(df.index, fill_value=0))

将最后结果乘以60,即可增加1分钟:

原始答案:最初的回答

df['Timestamp_data'] = df['Timestamp_data'].ffill()  + s * 60

print (df)
           Timestamp_data
0 2018-09-26 04:25:32.544
1 2018-09-26 04:38:32.544
2 2018-09-26 04:39:32.544
3 2018-09-26 04:40:32.544
4 2018-09-26 04:41:32.544
5 2018-09-26 04:58:32.544
6 2018-09-26 04:59:32.544

将多个秒数除以60,仅保留一秒:

最初的回答:

df['Timestamp_data'] = df['Timestamp_data'].ffill()  + s 
print (df)
           Timestamp_data
0 2018-09-26 04:25:32.544
1 2018-09-26 04:38:32.544
2 2018-09-26 04:38:33.544
3 2018-09-26 04:38:34.544
4 2018-09-26 04:38:35.544
5 2018-09-26 04:58:32.544
6 2018-09-26 04:58:33.544

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接