我在 google 上搜索了几个小时来解决这个问题,但我一直无法找到有关这些参数的任何信息。我想查找与特定日期时间关联的值是否出现在另一个不同大小的数据框中的至少一个日期时间范围之间。以下是示例数据框:
import pandas as pd
df1 = pd.DataFrame({'Datetime': ['2020-01-01 01:01:01', '2020-01-01 10:10:10', '2020-01-01 12:10:01', '2020-01-02 03:16:24', '2020-12-01 04:34:21'], 'Value': [0.006, 0.002, 0.005, 0.034, 0.001]})
df2 = pd.DataFrame({'Start': ['2020-01-01 01:01:00', '2020-01-01 07:10:10', '2020-01-01 21:10:01', '2020-01-03 06:16:24', '2020-12-25 14:12:34'], 'End': ['2020-01-01 02:00:00', '2020-01-01 08:01:01', '2020-01-01 21:34:09', '2020-01-01 09:23:42', '2020-12-25 15:13:21']})
# convert columns to datetime format
df1.Datetime = pd.to_datetime(df1.Datetime)
df2[['Start', 'End']] = df2[['Start', 'End']].apply(pd.to_datetime)
df1
Datetime Value Check
2020-01-01 01:01:01 0.006
2020-01-01 10:10:10 0.002
2020-01-01 12:10:01 0.005
2020-01-02 03:16:24 0.034
2020-12-01 04:34:21 0.001
df2
Start End
2020-01-01 01:01:00 2020-01-01 02:00:00
2020-01-01 07:10:10 2020-01-01 08:01:01
2020-01-01 21:10:01 2020-01-01 21:34:09
2020-01-03 06:16:24 2020-01-01 09:23:42
2020-12-25 14:12:34 2020-12-25 15:13:21
如果与索引 1 处的 df1['Datetime']
关联的 df1['Value']
位于 df2
中的任何范围之间,如果关联的日期时间不在任何范围之间,该函数应在 df1['Check']
和 False
中返回 True
。这应该继续检查 df1
中的每个索引与 df2
中的所有范围。
我试过使用 pd.DataFrame.any
,但这会抛出 “ValueError: Can only compare same-labeled Series objects”
。我在想一个嵌套的 for 循环
将是要走的路,但我不知道如何为这样的事情设置一个。
最佳答案
使用numpy的数组广播:
dt = df1['Datetime'].to_numpy()
start = df2['Start'].to_numpy()[:, None]
end = df2['End'].to_numpy()[:, None]
mask = (start <= dt) & (dt <= end)
df1['Check'] = mask.any(axis=0)
关于python - 如何确定日期时间列中的值是否在来自另一个数据帧的任何一对日期时间之间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66191317/