首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据最近的日期时间合并两个数据帧

根据最近的日期时间合并两个数据帧
EN

Stack Overflow用户
提问于 2018-12-31 12:01:34
回答 1查看 935关注 0票数 2

我有两个数据集,一个包含空气质量数据,另一个包含天气数据,每个数据集都有一个名为“dt”的日期和时间列。然而,这些时间并不完全匹配。我想连接这些表,以便保留空气质量数据,并匹配和合并天气数据上最接近的时间。

df_aq:

代码语言:javascript
运行
复制
                  dt   Latitude  Longitude  ...   Speed_kmh  PM2.5  PM10
0    11/20/2018 12:16  33.213922 -97.151055  ...        0.35   16.0  86.1
1    11/20/2018 12:16  33.213928 -97.151007  ...        5.01   16.0  86.1
2    11/20/2018 12:16  33.213907 -97.150953  ...        5.27   16.0  86.1
3    11/20/2018 12:16  33.213872 -97.150883  ...        5.03   16.0  86.1
...
364  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3
365  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3
366  11/20/2018 12:46  33.209462 -97.148623  ...        0.00    2.8   6.3]

df_weather:

代码语言:javascript
运行
复制
     USAF  WBAN               dt  DIR SPD ... PCP01  PCP06  PCP24  PCPXX
0  722589  3991  11/20/2018 0:53  360   6 ...     0  *****  *****  *****
1  722589  3991  11/20/2018 1:53  350   6 ...     0  *****  *****  *****
2  722589  3991  11/20/2018 2:53  310   3 ...     0  *****  *****  *****
3  722589  3991  11/20/2018 3:53  330   5 ...     0  *****  *****  *****
4  722589  3991  11/20/2018 4:53  310   6 ...     0  *****  *****  *****

df_aq的范围是12:16-12:46,df_weather每小时有53分钟的数据。因此,最接近的时间是11:53和12:53,所以我希望这两个时间和随后的天气数据与df_aq上的所有数据适当地合并

我已经尝试过iloc和Index.get_loc,因为这似乎是最好的方法,但我一直收到错误。

我试过了:

代码语言:javascript
运行
复制
ctr = df_aq['dt'].count() - 1 
startTime = df_aq['dt'][0]
endTime = df_aq['dt'][ctr]
print df_weather.iloc[df_weather.index.get_loc(startTime,method='nearest') or df_weather.index.get_loc(endTime,method='nearest')]

但是我得到了一个错误:

代码语言:javascript
运行
复制
TypeError: unsupported operand type(s) for -: 'long' and 'str'

我不确定这个错误是什么意思

有没有比iloc更好的方法呢?如果没有,我在这段代码中做错了什么?

非常感谢您能提供的任何帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-31 17:28:57

我冒然举了一个我在学习过程中使用的例子:-),希望它能帮助你实现你正在寻找的东西。

正如评论部分所述,您可以尝试使用特殊函数merge_asof()来合并时间序列DataFrames

DataFrame优先:

代码语言:javascript
运行
复制
>>> df1
                     time ticker   price  quantity
0 2016-05-25 13:30:00.023   MSFT   51.95        75
1 2016-05-25 13:30:00.038   MSFT   51.95       155
2 2016-05-25 13:30:00.048   GOOG  720.77       100
3 2016-05-25 13:30:00.048   GOOG  720.92       100
4 2016-05-25 13:30:00.048   AAPL   98.00       100

DataFrame Second:

代码语言:javascript
运行
复制
>>> df2
                     time ticker     bid     ask
0 2016-05-25 13:30:00.023   GOOG  720.50  720.93
1 2016-05-25 13:30:00.023   MSFT   51.95   51.96
2 2016-05-25 13:30:00.030   MSFT   51.97   51.98
3 2016-05-25 13:30:00.041   MSFT   51.99   52.00
4 2016-05-25 13:30:00.048   GOOG  720.50  720.93
5 2016-05-25 13:30:00.049   AAPL   97.99   98.01
6 2016-05-25 13:30:00.072   GOOG  720.50  720.88
7 2016-05-25 13:30:00.075   MSFT   52.01   52.03


>>> new_df = pd.merge_asof(df1, df2, on='time', by='ticker')

>>> new_df
                     time ticker   price  quantity     bid     ask
0 2016-05-25 13:30:00.023   MSFT   51.95        75   51.95   51.96
1 2016-05-25 13:30:00.038   MSFT   51.95       155   51.97   51.98
2 2016-05-25 13:30:00.048   GOOG  720.77       100  720.50  720.93
3 2016-05-25 13:30:00.048   GOOG  720.92       100  720.50  720.93
4 2016-05-25 13:30:00.048   AAPL   98.00       100     NaN     NaN

请查看文档Doc merge_asof

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53983467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档