如何使用定义持续时间的两个日期时间变量重新索引数据框
How to reindex a dataframe using two datetime variables that define a duration
我正在尝试重新索引我的数据框,它有两个定义持续时间的日期时间变量。我希望我的数据帧由一个日期时间变量索引,该变量递增 1 分钟,缺少 values/strings,其中没有观察。
我的数据看起来像这样
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 StringVariable
1 1/22/2016 14:45 NaN NaN NaN
1 1/22/2016 14:46 NaN NaN NaN
1 1/22/2016 14:47 0 0 ABC
1 1/22/2016 14:48 0 0 ABC
1 1/22/2016 14:49 0 0 ABC
1 1/22/2016 14:50 0 0 ABC
1 1/22/2016 14:51 NaN NaN NaN
1 1/22/2016 14:52 NaN NaN NaN
1 1/22/2016 14:53 1 0 DE
1 1/22/2016 14:54 1 0 DE
1 1/22/2016 14:55 1 0 DE
1 1/22/2016 14:56 1 0 DE
1 1/22/2016 14:57 1 0 DE
1 1/22/2016 14:58 NaN NaN NaN
1 1/22/2016 14:59 NaN NaN NaN
1 1/22/2016 15:00 NaN NaN NaN
2 1/22/2016 14:45 0 0 FG
2 1/22/2016 14:46 0 0 FG
2 1/22/2016 14:47 0 0 FG
2 1/22/2016 14:48 0 0 FG
2 1/22/2016 14:49 0 0 FG
2 1/22/2016 14:50 0 0 FG
2 1/22/2016 14:51 0 0 FG
2 1/22/2016 14:52 0 0 FG
2 1/22/2016 14:53 0 0 FG
2 1/22/2016 14:54 0 0 FG
2 1/22/2016 14:55 0 0 FG
2 1/22/2016 14:56 0 0 FG
2 1/22/2016 14:57 NaN NaN NaN
2 1/22/2016 14:58 NaN NaN NaN
2 1/22/2016 14:59 NaN NaN NaN
2 1/22/2016 15:00 NaN NaN NaN
3 1/22/2016 14:45 NaN NaN NaN
3 1/22/2016 14:46 NaN NaN NaN
3 1/22/2016 14:47 NaN NaN NaN
3 1/22/2016 14:48 0 1 XYZ
3 1/22/2016 14:49 0 1 XYZ
3 1/22/2016 14:50 0 1 XYZ
3 1/22/2016 14:51 0 1 XYZ
3 1/22/2016 14:52 0 1 XYZ
3 1/22/2016 14:53 NaN NaN NaN
3 1/22/2016 14:54 NaN NaN NaN
3 1/22/2016 14:55 NaN NaN NaN
3 1/22/2016 14:56 NaN NaN NaN
3 1/22/2016 14:57 NaN NaN NaN
3 1/22/2016 14:58 NaN NaN NaN
3 1/22/2016 14:59 NaN NaN NaN
3 1/22/2016 15:00 NaN NaN NaN
有什么想法吗?我可以使用 pandas.date_range
创建索引,但我遇到了合并 EndTime
的挑战,它因观察而异。
你总是可以逐行处理它:1),创建一个空的DataFrame res
; 2)、选取DMS
中的一行,将行值填入res
中的相关行; 3)、循环直到处理完所有行。
这里我用一些(可能是不必要的)技巧来解决它。通过利用 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)
我正在尝试重新索引我的数据框,它有两个定义持续时间的日期时间变量。我希望我的数据帧由一个日期时间变量索引,该变量递增 1 分钟,缺少 values/strings,其中没有观察。
我的数据看起来像这样
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 StringVariable
1 1/22/2016 14:45 NaN NaN NaN
1 1/22/2016 14:46 NaN NaN NaN
1 1/22/2016 14:47 0 0 ABC
1 1/22/2016 14:48 0 0 ABC
1 1/22/2016 14:49 0 0 ABC
1 1/22/2016 14:50 0 0 ABC
1 1/22/2016 14:51 NaN NaN NaN
1 1/22/2016 14:52 NaN NaN NaN
1 1/22/2016 14:53 1 0 DE
1 1/22/2016 14:54 1 0 DE
1 1/22/2016 14:55 1 0 DE
1 1/22/2016 14:56 1 0 DE
1 1/22/2016 14:57 1 0 DE
1 1/22/2016 14:58 NaN NaN NaN
1 1/22/2016 14:59 NaN NaN NaN
1 1/22/2016 15:00 NaN NaN NaN
2 1/22/2016 14:45 0 0 FG
2 1/22/2016 14:46 0 0 FG
2 1/22/2016 14:47 0 0 FG
2 1/22/2016 14:48 0 0 FG
2 1/22/2016 14:49 0 0 FG
2 1/22/2016 14:50 0 0 FG
2 1/22/2016 14:51 0 0 FG
2 1/22/2016 14:52 0 0 FG
2 1/22/2016 14:53 0 0 FG
2 1/22/2016 14:54 0 0 FG
2 1/22/2016 14:55 0 0 FG
2 1/22/2016 14:56 0 0 FG
2 1/22/2016 14:57 NaN NaN NaN
2 1/22/2016 14:58 NaN NaN NaN
2 1/22/2016 14:59 NaN NaN NaN
2 1/22/2016 15:00 NaN NaN NaN
3 1/22/2016 14:45 NaN NaN NaN
3 1/22/2016 14:46 NaN NaN NaN
3 1/22/2016 14:47 NaN NaN NaN
3 1/22/2016 14:48 0 1 XYZ
3 1/22/2016 14:49 0 1 XYZ
3 1/22/2016 14:50 0 1 XYZ
3 1/22/2016 14:51 0 1 XYZ
3 1/22/2016 14:52 0 1 XYZ
3 1/22/2016 14:53 NaN NaN NaN
3 1/22/2016 14:54 NaN NaN NaN
3 1/22/2016 14:55 NaN NaN NaN
3 1/22/2016 14:56 NaN NaN NaN
3 1/22/2016 14:57 NaN NaN NaN
3 1/22/2016 14:58 NaN NaN NaN
3 1/22/2016 14:59 NaN NaN NaN
3 1/22/2016 15:00 NaN NaN NaN
有什么想法吗?我可以使用 pandas.date_range
创建索引,但我遇到了合并 EndTime
的挑战,它因观察而异。
你总是可以逐行处理它:1),创建一个空的DataFrame res
; 2)、选取DMS
中的一行,将行值填入res
中的相关行; 3)、循环直到处理完所有行。
这里我用一些(可能是不必要的)技巧来解决它。通过利用 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)