【发布时间】:2015-12-02 20:18:36
【问题描述】:
我在 pandas 中创建了一个重采样数据框 (DF1),带有 datetimeindex。我有一个带有datetimeindex 和time 列的单独数据框(DF2)。如果 DF2 中的 time 实例落在 DF1 中 datetimeindex 的 30 分钟 bin 内。我想用 DF1 中 30 分钟 bin 中的适当 speed 标记 DF2 中 time 的每个实例。
DF1
boat_id speed
time
2015-01-13 09:00:00 28.000000 0.000000
2015-01-13 09:30:00 28.000000 0.723503
2015-01-13 10:00:00 28.000000 2.239399
DF2
id boat_id time state
time
2015-01-18 16:09:03 319437 28 2015-01-18 16:09:03 2
2015-01-18 16:18:43 319451 28 2015-01-18 16:18:43 0
2015-03-01 09:39:51 507108 31 2015-03-01 09:39:51 1
2015-03-01 09:40:58 507109 31 2015-03-01 09:40:58 0
想要的结果
id boat_id time state speed
time
2015-01-18 16:09:03 319437 28 2015-01-18 16:09:03 2 nan
2015-01-18 16:18:43 319451 28 2015-01-18 16:18:43 0 nan
2015-03-01 09:39:51 507108 31 2015-03-01 09:39:51 1 2.239399
2015-03-01 09:40:58 507109 31 2015-03-01 09:40:58 0 2.239399
我创建了这个脚本来尝试执行此操作,但我认为它失败了,因为 DF1 的 datetimeindex 是不可变的,因此我的 timedelta 请求不会为块创建起点。我的一个想法是是否可以将 DF1 的 datetimeindex 复制到一个新列中,其中对象是可变的,但我还没有管理它,所以我不能 100% 确定逻辑。我很乐意修补,但目前我已经停滞了一段时间,所以希望其他人可能有一些想法。提前致谢。
for row in DF1.iterrows():
for dfrow in DF2.iterrows():
if dfrow[0] > row[0] - dt.timedelta(minutes=30) and dfrow[0] < row[0]:
df['test'] = row[1]
【问题讨论】:
-
你为什么不试试
between_time()? -
@Kartik,感谢您的建议,我尝试了
for row in DF1.iterrows(): for dfrow in DF2.iterrows(): if dfrow['time'] == DF1[pd.DataFrame.between_time(row[0] - dt.timedelta(minutes=15), row[0])]: df['test'] = row[1],但得到了结果TypeError: tuple indices must be integers, not str如果我使用int 而不是字符串,我会得到IndexError: tuple index out of range或TypeError: unbound method between_time() must be called with DataFrame instance as first argument (got Timestamp instance instead)我错过了什么? -
我想知道它是否与数据帧中的标题有关?
-
老兄!那是错的!等等,我来回答……