为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用定义持续时间的两个日期时间变量重新索引数据框

如何使用定义持续时间的两个日期时间变量重新索引数据框

holdtom 2022-01-18 21:27:47
我正在尝试重新索引具有两个定义持续时间的日期时间变量的数据框。我希望我的数据框被一个以 1 分钟递增的日期时间变量索引,其中缺少没有观察的值/字符串。我的数据看起来像这样DMS = pandas.DataFrame({  'ID':[1,1,2,3],  'SentTime':['2016-01-22 14:47:05.486877', '2016-01-22 14:53:03.234377', '2016-01-22 14:45:09.434877','2016-01-22 14:48:05.486877'],  'EndTime':['2016-01-22 14:50:10.454347', '2016-01-22 14:57:45.456877', '2016-01-22 14:56:05.456877','2016-01-22 14:52:05.486877'],  'BinaryVariable1':[0, 1, 0, 0],  'BinaryVariable2':[0, 0, 0, 1],  'StringVariable':['ABC','DE','FG','XYZ']})我希望这个数据框看起来像ID  Time    BinaryVariable1 BinaryVariable2 StringVariable1   1/22/2016 14:45 NaN NaN NaN1   1/22/2016 14:46 NaN NaN NaN1   1/22/2016 14:47 0   0   ABC1   1/22/2016 14:48 0   0   ABC1   1/22/2016 14:49 0   0   ABC1   1/22/2016 14:50 0   0   ABC1   1/22/2016 14:51 NaN NaN NaN1   1/22/2016 14:52 NaN NaN NaN1   1/22/2016 14:53 1   0   DE1   1/22/2016 14:54 1   0   DE1   1/22/2016 14:55 1   0   DE1   1/22/2016 14:56 1   0   DE1   1/22/2016 14:57 1   0   DE1   1/22/2016 14:58 NaN NaN NaN1   1/22/2016 14:59 NaN NaN NaN1   1/22/2016 15:00 NaN NaN NaN2   1/22/2016 14:45 0   0   FG2   1/22/2016 14:46 0   0   FG2   1/22/2016 14:47 0   0   FG2   1/22/2016 14:48 0   0   FG2   1/22/2016 14:49 0   0   FG2   1/22/2016 14:50 0   0   FG2   1/22/2016 14:51 0   0   FG2   1/22/2016 14:52 0   0   FG2   1/22/2016 14:53 0   0   FG2   1/22/2016 14:54 0   0   FG2   1/22/2016 14:55 0   0   FG2   1/22/2016 14:56 0   0   FG2   1/22/2016 14:57 NaN NaN NaN2   1/22/2016 14:58 NaN NaN NaN2   1/22/2016 14:59 NaN NaN NaN2   1/22/2016 15:00 NaN NaN NaN3   1/22/2016 14:45 NaN NaN NaN3   1/22/2016 14:46 NaN NaN NaN3   1/22/2016 14:47 NaN NaN NaN3   1/22/2016 14:48 0   1   XYZ3   1/22/2016 14:49 0   1   XYZ3   1/22/2016 14:50 0   1   XYZ3   1/22/2016 14:51 0   1   XYZ有任何想法吗?我可以使用创建索引,pandas.date_range但我遇到了一个挑战,该挑战EndTime因观察而异。
查看完整描述

1 回答

?
慕的地8271018

TA贡献1796条经验 获得超4个赞

您总是可以逐行处理它: 1),创建一个空的 DataFrame res;2)、选取一行并用行值DMS填写相关行;res3)、循环直到处理完所有行。


在这里,我用一些(可能是不必要的)技巧来解决它。通过利用apply方法,您不必DMS自己迭代:



DMS['SentTime'] = pd.to_datetime(DMS['SentTime']).dt.floor('60S')

DMS['EndTime'] = pd.to_datetime(DMS['EndTime']).dt.floor('60S')


dt_idx = pd.date_range(start=DMS['SentTime'].min(),end=DMS['EndTime'].max(),freq='60S')

# may you need '2016-01-22 15:00:00' as end insteand of DMS['EndTime'].max()

res = pd.DataFrame(index=pd.MultiIndex.from_product([DMS['ID'].unique(),dt_idx],names=['ID','TIME']),columns=DMS.columns)


def p(x):    

    _s = pd.IndexSlice[(x['ID'],pd.DatetimeIndex(start=x['SentTime'],end=x['EndTime'],freq='60S')),:]

    res.loc[_s] = x.values

    return '**'


DMS.apply(p,axis=1)


print(res)


查看完整回答
反对 回复 2022-01-18
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信