用1秒增量填充pandas时间戳列NaT值及numpy.diff报错问题
解决Pandas Series中用前序有效时间戳累加时间填充NaT的问题
嘿,我懂你要做的事——把Series里的NaT用前一个有效时间戳依次累加时间(看你给的结果应该是加1分钟,不过你描述里写的是1秒,我会两种情况都说明)来填充,还碰到了numpy新版本里np.diff()处理布尔值报TypeError的坑,这就给你一个完全避开这个问题的靠谱方案:
首先咱们先把你的示例数据构造出来:
import pandas as pd import numpy as np # 还原你提供的Timestamp_data ts_series = pd.Series([ '2018-09-26 04:38:32.544', pd.NaT, pd.NaT, pd.NaT, '2018-09-26 04:58:32.544', pd.NaT ], dtype='datetime64[ns]')
接下来是核心代码,全程不用np.diff(),完美避开那个TypeError:
# 第一步:标记哪些位置是有效时间戳(非NaT) valid_mask = ts_series.notna() # 第二步:给每个有效时间戳分配一个组编号,NaT会继承前一个有效时间戳的组号 group_ids = valid_mask.cumsum() # 第三步:计算每个组内的偏移量——从0开始递增,对应要加的时间数 group_offsets = group_ids.groupby(group_ids).cumcount() # 第四步:填充基准时间,再加上对应的偏移时间 # 如果是按你描述的加1秒,用unit='s' filled_series_sec = ts_series.ffill() + pd.to_timedelta(group_offsets, unit='s') # 如果是按你给出的预期结果加1分钟,改成unit='min' filled_series_min = ts_series.ffill() + pd.to_timedelta(group_offsets, unit='min')
咱们来验证一下加1分钟的情况,打印filled_series_min就能得到你想要的结果:
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 dtype: datetime64[ns]
简单解释下这个方法的逻辑:
valid_mask.cumsum()会给每个有效时间戳生成一个递增的组ID,比如第一个有效时间戳是组1,中间三个NaT都属于组1,第二个有效时间戳是组2,最后一个NaT属于组2group_offsets在每个组内生成从0开始的序列,比如组1里是[0,1,2,3],组2里是[0,1],这个数字就是每个位置需要在基准时间上累加的时间单位数- 最后用
ffill()拿到每个位置的基准时间(前一个有效时间戳),加上对应的偏移时间就搞定了,全程不碰np.diff(),自然不会触发那个布尔值的TypeError
内容的提问来源于stack exchange,提问作者cincin21
相关产品推荐
相关产品推荐

