python - 比较谷歌应用程序引擎数据存储中的多个日期范围(多对多,Python)

标签 python google-app-engine python-2.7 datastore date-range

我在 Google App Engine 数据存储区中有两个数据集。

class First_Set(db.Model):
  start_time = db.DateTimeProperty()
  end_time = db.DateTimeProperty()
  data1 = db.FloatProperty()
  ...

class Second_Set(db.Model):
  start_time = db.DateTimeProperty()
  end_time = db.DateTimeProperty()
  data2 = db.FloatProperty()
  ...

(它们有其他不同的数据,这就是它们位于不同数据集中的原因。)

我希望找到两个数据集中所有重叠的 start_time 和 end_time 的数据存储 ID,理想情况下无需从一个数据集中提取结果并在另一个数据集上迭代第一个结果。

初始数据集的精彩可视化来自 here (它也有在SQL中解决的问题):

1     |-----| 
2        |-----| 
3                 |--| 
4                       |-----| 
5                          |-----| 
6                                  |---| 
7                                        |---|  
8                           |---| 
9                                       |-----|

我需要的最终结果是(来自同一个example):

+----+---------------------+----+---------------------+ 
| id | start               | id | end                 | 
+----+---------------------+----+---------------------+ 
|  2 | 2008-09-01 15:02:00 |  1 | 2008-09-01 15:04:00 | 
|  5 | 2008-09-01 16:19:00 |  4 | 2008-09-01 16:23:00 | 
|  8 | 2008-09-01 16:20:00 |  4 | 2008-09-01 16:22:00 | 
|  8 | 2008-09-01 16:20:00 |  5 | 2008-09-01 16:22:00 | 
|  7 | 2008-09-01 18:18:00 |  9 | 2008-09-01 18:22:00 | 
+----+---------------------+----+---------------------+ 

SQL 解决方案在下面的示例中进行了描述,但由于缺少 JOIN,我无法在数据存储中执行此操作:

SELECT v1.id, v1.start, v2.id, LEAST(v1.end,v2.end) AS end 
FROM visits v1 
JOIN visits v2 ON v1.id <> v2.id and v1.start >= v2.start and v1.start < v2.end  
ORDER BY v1.start;

据我了解,使用 ListProperty() (来自 this question ),一对多版本相当简单。

有人能想出一个解决方案来找到重叠时间(最好是用Python)吗?

最佳答案

查看Marzullo's algorithm其时间效率为O(n log n)。
还有many question on Stackoverflow涵盖重叠间隔,可用于解决您在 AppEngine 上的问题。

关于python - 比较谷歌应用程序引擎数据存储中的多个日期范围(多对多,Python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11161238/

相关文章:

java - 如何制作自定义网址,例如 mywebsite.com/movie_title 而不是 mywebsite.com/movie?id=9282

python - 为什么在使用替换函数时反向引用在 Python 的 re.sub 中不起作用?

python-2.7 - 使用 dill 加载 pkl 文件

python - 在Python中创建多个需要能够互相调用的函数

python - 从文本字符串解析数据对象结构

python - 您使用什么方法和工具来设计和分析 Web 应用程序中的工作流(适用于小型团队)

google-app-engine - syncdb 的 django nonrel appengine 问题

python - 在 GAE 项目中包含和引用第 3 方库

python - 如何使用 Python + Selenium 设置代理身份验证(用户和密码)

python - 使用 ProxyConnector 进行 aiohtttp 连接池