- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 pandas 中使用 datetimeindex
创建了一个重采样数据框 (DF1)。我有一个单独的数据框 (DF2),其中包含 datetimeindex
和 time
列。如果 DF2 中的 time
实例落在 DF1 中 datetimeindex
的 30 分钟区间内。我想用 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
请求不会为 block 。我的一个想法是,是否可以将 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]
最佳答案
迭代的性能很低。更好的是使用矢量化解决方案。我使用两次函数 merge
. Docs .
输入:
print df1
boat_id speed
time
2015-03-01 09:00:00 28 0.000000
2015-03-01 09:30:00 28 0.723503
2015-03-01 10:00:00 28 2.239399
print 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
我重置了两个数据帧的索引并创建了由 1
填充的辅助列 i
。
df1 = df1.reset_index()
df2 = df2.reset_index(drop=True)
df1['i'] = df2['i'] = 1
print df1
time boat_id speed i
0 2015-03-01 09:00:00 28 0.000000 1
1 2015-03-01 09:30:00 28 0.723503 1
2 2015-03-01 10:00:00 28 2.239399 1
print df2
id boat_id time state i
0 319437 28 2015-01-18 16:09:03 2 1
1 319451 28 2015-01-18 16:18:43 0 1
2 507108 31 2015-03-01 09:39:51 1 1
3 507109 31 2015-03-01 09:40:58 0 1
然后我通过辅助列 i
合并了两个数据帧。
df = df2.merge(df1, on='i', how='left')
df = df.rename(columns={'time_y':'Bin_time', 'time_x':'time'})
print df
id boat_id_x time state i Bin_time \
0 319437 28 2015-01-18 16:09:03 2 1 2015-03-01 09:00:00
1 319437 28 2015-01-18 16:09:03 2 1 2015-03-01 09:30:00
2 319437 28 2015-01-18 16:09:03 2 1 2015-03-01 10:00:00
3 319451 28 2015-01-18 16:18:43 0 1 2015-03-01 09:00:00
4 319451 28 2015-01-18 16:18:43 0 1 2015-03-01 09:30:00
5 319451 28 2015-01-18 16:18:43 0 1 2015-03-01 10:00:00
6 507108 31 2015-03-01 09:39:51 1 1 2015-03-01 09:00:00
7 507108 31 2015-03-01 09:39:51 1 1 2015-03-01 09:30:00
8 507108 31 2015-03-01 09:39:51 1 1 2015-03-01 10:00:00
9 507109 31 2015-03-01 09:40:58 0 1 2015-03-01 09:00:00
10 507109 31 2015-03-01 09:40:58 0 1 2015-03-01 09:30:00
11 507109 31 2015-03-01 09:40:58 0 1 2015-03-01 10:00:00
boat_id_y speed
0 28 0.000000
1 28 0.723503
2 28 2.239399
3 28 0.000000
4 28 0.723503
5 28 2.239399
6 28 0.000000
7 28 0.723503
8 28 2.239399
9 28 0.000000
10 28 0.723503
11 28 2.239399
输出按 bin 时间过滤:
df = df[((df.time >= (df.Bin_time - dt.timedelta(minutes=30))) & (df.time <= df.Bin_time ))]
df = df.drop(['Bin_time', 'id', 'boat_id_x', 'boat_id_y','state', 'i' ], axis=1 )
print df
time speed
8 2015-03-01 09:39:51 2.239399
11 2015-03-01 09:40:58 2.239399
并且 df
按列 time
与数据帧 df2
合并。
df = df2.merge(df, on='time', how='left').reset_index(drop=True)
df = df.drop([ 'i' ], axis=1 )
print df
id boat_id time state speed
0 319437 28 2015-01-18 16:09:03 2 NaN
1 319451 28 2015-01-18 16:18:43 0 NaN
2 507108 31 2015-03-01 09:39:51 1 2.239399
3 507109 31 2015-03-01 09:40:58 0 2.239399
比较矢量化和索引方法,您可以在类似的答案中找到 here .
关于python - Pandas,检查 datetimeindex 的重采样 30 分钟时间段中是否存在时间戳值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33551881/
如果我使用以下方法计算 java.time 中 2 个 LocalDate 之间的差异: Period p = Period.between(testDate, today); 然后我得到一个包含年、
我正在开发一个有多种不同费率的预订平台。这些费率由一天中的时间、星期几和一年中的一天决定。以下是所涉及的间隔类型的一些示例: 周一至周五,上午 9 点至下午 5 点 周六和周日,中午 12 点到早上
我有大量数据,包括开始时间、停止时间和值。开始和停止时间因行而异,以 5 分钟为增量。我正在尝试创建一个新的数据框,该数据框具有 5 分钟的间隔以及该间隔在行的开始和停止范围内的所有行的总和。 我有一
我有一个这样的表: --------------------------------------------- |Id | Step | StartedAt
我有一个网络应用程序,用户将在其中输入 2 个日期。一个 StartDate 和一个 EndDate。现在我想编写它,以便在选择 StartDate 和 EndDate 时确定有多少周,然后显示这些周
这看起来并不直截了当。 我正在尝试: @Override public int compare(Period o1, Period o2) { return o1.toStandardDays
我必须为团队发送 session 邀请,这是我的邮件 $ical = 'BEGIN:VCALENDAR PRODID:-//Microsoft Corporation//Outlook 11.0
我有这个 ISO 8601 时间段字符串: P0Y0M0DT3H5M0.000S 并且 PHP7.4 无法用它构造 DateInterval。 format('%h Hours %m Minutes
我想要获取包含一段时间(格式为 HH:MM:SS)的多个单元格的总和。在 LibreOffice Calc 4.0.3.3 中,我复制粘贴了 G14:G21 范围内的时间段,并将单元格格式设置为时间
我有一个表(MySQL),每n秒捕获一次样本。该表有很多列,但重要的是两列:时间戳(TIMESTAMP 类型)和计数(INT 类型)。 我想做的是获取一定时间范围内计数列的总和和平均值。例如,我每 2
我有一个表(MySQL),每n秒捕获一次样本。该表有很多列,但重要的是两列:时间戳(TIMESTAMP 类型)和计数(INT 类型)。 我想做的是获取一定时间范围内计数列的总和和平均值。例如,我每 2
我在一个项目上使用 joda-time (1.6.2),我正在做的其中一件事就是计算预测时间和实际时间之间的差异。这种差异有时是积极的,有时是消极的。虽然适当的方法可能是使用 Duration 而不是
我有一个表 (MySQL),它每 n 秒捕获一次样本。该表有很多列,但最重要的是两列:一个时间戳(TIMESTAMP 类型)和一个计数(INT 类型)。 我想做的是获取计数列在一段时间内的总和和平均值
我想让我的折线图显示过去 3 个月的数据。 GDS 有一个“最后一个季度”的日期范围,但这显示的是 Q1、Q2、Q3 或 Q4。我需要的是过去3个整月(不算当月)的数据。我尝试创建一个计算字段,但事实
我想让我的折线图显示过去 3 个月的数据。 GDS 有一个“最后一个季度”的日期范围,但这显示的是 Q1、Q2、Q3 或 Q4。我需要的是过去3个整月(不算当月)的数据。我尝试创建一个计算字段,但事实
我是一名优秀的程序员,十分优秀!