gpt4 book ai didi

python - 寻求比较和过滤 Pandas 日期范围重叠的有效方法

转载 作者:太空宇宙 更新时间:2023-11-04 03:59:47 26 4
gpt4 key购买 nike

我有一个包含两列的数据框,其中包含日期范围。

原始数据看起来像这样:

df1:
personid, visitto, intime, outtime
8, 8, 2017-07-01 06:00:00, 2017-07-01 08:00:00
17 8, 2017-07-02 09:00:00, 2017-07-02 10:00:00

df2:
location, open, close
8, 2017-07-01 04:00:00, 2017-07-01 13:00:00

这是我到目前为止所做的:1. 合并 visitto->location

上的两个数据框
merged_df:
personid, visitto, intime, outtime, location, open, close
8, 8, 2017-07-01 06:00:00, 2017-07-01 08:00:00, 8, 2017-07-01 04:00:00, 2017-07-01 13:00:00
17 8, 2017-07-02 09:00:00, 2017-07-02 10:00:00, 8, 2017-07-01 04:00:00, 2017-07-01 13:00:00
  1. 将带有日期的四列转换为 pandas 间隔
personid, visitto, visittime, opentime
8, 8, [2017-07-01 06:00:00, 2017-07-01 08:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]
17 8, [2017-07-02 09:00:00, 2017-07-02 10:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]

我现在想过滤这个合并的间隔数据框,只返回日期时间重叠的行。我的预期结果是:

personid, visitto, visittime, opentime
8, 8, [2017-07-01 06:00:00, 2017-07-01 08:00:00], [2017-07-01 04:00:00, 2017-07-01 13:00:00]

我使用 iterrows() 并逐行比较重叠部分成功地获得了预期的结果,但是,这非常冗长。我更愿意做的是(非工作示例):

merged_df.loc[merged_df['visittime'].overlaps(merged_df['opentime'])]

或者,在合并数据帧期间完成此操作。类似于(非工作示例):

merge_df = pd.merge(df1[["personid", "visitto", "intime", "outtime"]], df2[["location", "open", "close"]], how='inner', left_on='visitto', right_on='location') #WHERE intime, outtime OVERLAPS open, close

是否可以从 Pandas 函数而不是循环执行此操作?这可以很容易地从数据库中的 Sql 完成,但是,我正在努力寻找一种有效的方法来对数据帧执行此操作。

最佳答案

与其创建您总是必须迭代的复合对象列(如list),不如使用内置的 pandas datetime功能(加上 here 的答案):

from io import StringIO
import pandas as pd

csv_buff = StringIO("""personid,visitto,intime,outtime,location,open,close
8,8,2017-07-01 06:00:00,2017-07-01 08:00:00,8,2017-07-01 04:00:00,2017-07-01 13:00:00
17,8,2017-07-02 09:00:00,2017-07-02 10:00:00, 8,2017-07-01 04:00:00,2017-07-01 13:00:00""")
csv_buff.seek(0)
dtypes = {
"intime": "datetime64",
"outtime": "datetime64",
"open": "datetime64",
"close": "datetime64"
}
df = pd.read_csv(csv_buff).astype(dtypes)

df[(df["intime"] <= df["close"]) & (df["open"] <= df["outtime"])]

结果:

   personid visitto              intime             outtime  location                open               close
0 8 8 2017-07-01 06:00:00 2017-07-01 08:00:00 8 2017-07-01 04:00:00 2017-07-01 13:00:00

关于python - 寻求比较和过滤 Pandas 日期范围重叠的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58596870/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com