python - 熊猫合并两个数据框并在日期之间加入日期
问题描述
有一个很有趣的案例。
有一个基于低粒度数据(2s)的列,如下所示df_1
:time
2018-08-31 22:59:47.980000+00:00 41.77
2018-08-31 22:59:49.979000+00:00 42.76
2018-08-31 22:59:51.979000+00:00 40.86
2018-08-31 22:59:53.979000+00:00 41.83
2018-08-31 22:59:55.979000+00:00 41.73
2018-08-31 22:59:57.979000+00:00 42.71
df_2
此数据和time
列的标签也按小时计算:
2018-08-31 22:00:00 0.0
2018-08-31 23:00:00 1.0
2018-09-01 00:00:00 0.0
2018-09-01 01:00:00 1.0
2018-09-01 02:00:00 0.0
我想df_1
与df_2
df_1 的时间合并在每两个连续的时间行df_2
之间(在给出标签的一小时之间)。如果我在df_2
(likestartTime
和endTime
) 中有两个时间列,我会使用pandasql
它的机会:
import pandasql
sqlcode = '''
select *
from df_1
inner join df_2 on df_1.time >= df_2.startTime and df_1.time <= df_2.endTime
'''
newdf = ps.sqldf(sqlcode,locals())
但在这种情况下,我只有一列。有什么办法可以在 Pandas 中解决这个问题?
解决方案
这是pd.merge_asof
问题,我在 df2 中创建了一个 keydat 日期对偶,以显示我们从 df2 合并的日期
#df1.Date=pd.to_datetime(df1.Date)
#df2.Date=pd.to_datetime(df2.Date)
yourdf=pd.merge_asof(df1,df2.assign(keydate=df2.Date),on='Date',direction='forward')
yourdf
Date ... keydate
0 2018-08-31 22:59:47.980 ... 2018-08-31 23:00:00
1 2018-08-31 22:59:49.979 ... 2018-08-31 23:00:00
2 2018-08-31 22:59:51.979 ... 2018-08-31 23:00:00
3 2018-08-31 22:59:53.979 ... 2018-08-31 23:00:00
4 2018-08-31 22:59:55.979 ... 2018-08-31 23:00:00
5 2018-08-31 22:59:57.979 ... 2018-08-31 23:00:00
[6 rows x 4 columns]
推荐阅读
- java - Java 数据结构问题,设置对象而不是特殊对象,如 Integer、Double、String 等
- javascript - 正则表达式去除从括号内返回空格
- php - 插入令牌时未捕获的 PDOException:SQLSTATE[HY000]
- python-3.x - 从字符串列表中删除所有转义序列
- python - Python、Pandas 和 Excel 的列问题;;
- spring - Spring Boot LocaleChangeInterceptor 在多线程环境中的行为
- c++ - C++ 运算符重载做双 * 对象
- php - PHP使用浏览器的后退按钮破坏会话问题
- sql-server - 未知时间时在 SQL Server 中比较日期的最佳实践
- android - Are ConstraintLayout Animations In ScrollView Possible?