GVKun编程网logo

在Python中查找日期范围重叠(在python中查找日期范围重叠怎么办)

26

本文将为您提供关于在Python中查找日期范围重叠的详细介绍,我们还将为您解释在python中查找日期范围重叠怎么办的相关知识,同时,我们还将为您提供关于FlutterFirebase查询过滤器的日期

本文将为您提供关于在Python中查找日期范围重叠的详细介绍,我们还将为您解释在python中查找日期范围重叠怎么办的相关知识,同时,我们还将为您提供关于Flutter Firebase查询过滤器的日期范围与另一个日期范围重叠、php-需要查看日期范围是否与sql中的另一个日期范围重叠、python – 在字符串中查找重叠和非重叠子串的数量、python 创建日期范围的实用信息。

本文目录一览:

在Python中查找日期范围重叠(在python中查找日期范围重叠怎么办)

在Python中查找日期范围重叠(在python中查找日期范围重叠怎么办)

我试图找到一种基于特定列(id)在数据框中查找重叠数据范围(每行提供的开始/结束日期)的更有效方法。

数据框在“来自”列上排序

我认为有一种方法可以像我一样避免“双重”应用功能…

import pandas as pdfrom datetime import datetimedf = pd.DataFrame(columns=[''id'',''from'',''to''], index=range(5), \                  data=[[878,''2006-01-01'',''2007-10-01''],                        [878,''2007-10-02'',''2008-12-01''],                        [878,''2008-12-02'',''2010-04-03''],                        [879,''2010-04-04'',''2199-05-11''],                        [879,''2016-05-12'',''2199-12-31'']])df[''from''] = pd.to_datetime(df[''from''])df[''to''] = pd.to_datetime(df[''to''])    id  from        to0   878 2006-01-01  2007-10-011   878 2007-10-02  2008-12-012   878 2008-12-02  2010-04-033   879 2010-04-04  2199-05-114   879 2016-05-12  2199-12-31

我使用“应用”功能在所有组上循环,并且在每个组中,每行使用“应用”:

def check_date_by_id(df):    df[''prevFrom''] = df[''from''].shift()    df[''prevTo''] = df[''to''].shift()    def check_date_by_row(x):        if pd.isnull(x.prevFrom) or pd.isnull(x.prevTo):            x[''overlap''] = False            return x        latest_start = max(x[''from''], x.prevFrom)        earliest_end = min(x[''to''], x.prevTo)        x[''overlap''] = int((earliest_end - latest_start).days) + 1 > 0        return x    return df.apply(check_date_by_row, axis=1).drop([''prevFrom'',''prevTo''], axis=1)df.groupby(''id'').apply(check_date_by_id)    id  from        to          overlap0   878 2006-01-01  2007-10-01  False1   878 2007-10-02  2008-12-01  False2   878 2008-12-02  2010-04-03  False3   879 2010-04-04  2199-05-11  False4   879 2016-05-12  2199-12-31  True

答案1

小编典典

您可以移动to列并直接减去日期时间。

df[''overlap''] = (df[''to''].shift()-df[''from'']) > timedelta(0)

分组时应用它id可能看起来像

df[''overlap''] = (df.groupby(''id'')                   .apply(lambda x: (x[''to''].shift() - x[''from'']) > timedelta(0))                   .reset_index(level=0, drop=True))

演示版

>>> df    id       from         to0  878 2006-01-01 2007-10-011  878 2007-10-02 2008-12-012  878 2008-12-02 2010-04-033  879 2010-04-04 2199-05-114  879 2016-05-12 2199-12-31>>> df[''overlap''] = (df.groupby(''id'')                       .apply(lambda x: (x[''to''].shift() - x[''from'']) > timedelta(0))                       .reset_index(level=0, drop=True))>>> df    id       from         to overlap0  878 2006-01-01 2007-10-01   False1  878 2007-10-02 2008-12-01   False2  878 2008-12-02 2010-04-03   False3  879 2010-04-04 2199-05-11   False4  879 2016-05-12 2199-12-31    True

Flutter Firebase查询过滤器的日期范围与另一个日期范围重叠

Flutter Firebase查询过滤器的日期范围与另一个日期范围重叠

如何解决Flutter Firebase查询过滤器的日期范围与另一个日期范围重叠?

我正在尝试建立一个预订机制,该机制不允许用户有两个重叠的预订。用户必须输入预订的日期范围,该日期范围将存储在Firebase(Cloud Firestore)中。在完成预订之前,我要检查它是否与此用户的另一个预订重叠。

我为每个预订请求存储了这两个变量,我想将其用于此查询:

selectedStartDate(时间戳) selectedEndDate(时间戳)

我尝试的方法无效:

bool overlappingBookingDateCheck(currentUserId,selectedDate) {

bool unavailable = false;

StreamBuilder(
    stream: FirebaseFirestore.instance
        .collection(''users'')
        .doc(currentUserId)
        .collection(''bookings'')
        .where("status",isEqualTo: "active")
        .where("selectedStartDate",isGreaterThanorEqualTo: selectedDate.start)
        .where("selectedEndDate",isLessthanorEqualTo: selectedDate.end)
        .snapshots(),builder: (ctx,streamSnapshot) {
      if (streamSnapshot.connectionState == ConnectionState.waiting) {
        return Center(
          child: CircularProgressIndicator(),);
      }
      // If there was a match in firebase,then there is an 
         // overlapping booking,so return unavaiable is true
      if (streamSnapshot.hasData) {
        unavailable = true;
      }
    });

return unavailable;
}

此代码有几个问题。一种是多重where语句是AND而不是OR。这使我无法检查开始日期或结束日期是否与另一个预订重叠。在两种情况下,都应拒绝预订。第二个是我收到一个错误,该错误无法用不等号运算符(或> =)过滤多个字段。

如果有人能帮助我如何获得所需的查询(检查所请求的预订日期范围是否与现有预订重叠),将感到非常高兴。

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

php-需要查看日期范围是否与sql中的另一个日期范围重叠

php-需要查看日期范围是否与sql中的另一个日期范围重叠

我有一个表,用于存储房间的预订,架构为:

ID | ROOM_ID | CHECK_IN_DATE | CHECK_OUT_DATE | USER_ID

我需要对房间在设定的日期范围内可用/不可用的房间进行搜索查询.

还请记住,存在另一个表,该表保存了预定客房时的日期,其格式为:

ROOM_ID | DATE

因此,我需要运行一个查询,以查找设置范围内的可用房间,我将如何制定查询条件?
我在这里使用MysqL.

– -编辑 – –

还有一个模式的Rooms表:

ID | ROOM DETAILS etc

“不可用/预定日期”表基本上只包含零星的单个日期,“不可用”表中的每个日期是指由于某种原因无法预订房间的日期,例如:维护等

解决方法:

SELECT
   ROOM_ID
FROM
   Rooms r
   LEFT JOIN Bookings b ON (
      r.ROOM_ID = b.ROOM_ID
      AND b.CHECK_IN_DATE > '$MAX_DATE'
      AND b.CHECK_OUT_DATE < '$MIN_DATE'
   )

我不确定预定房间的因素,因为没有日期范围.预订房间是否还会获得预订条目?

python – 在字符串中查找重叠和非重叠子串的数量

python – 在字符串中查找重叠和非重叠子串的数量

PS:这不是 How to find the overlap between 2 sequences,and return it的副本

[虽然如果可以应用于以下问题我请求上述方法的解决方案]

问:虽然我做对了,但它仍然不是一个可扩展的解决方案,绝对没有优化(分数低).阅读以下问题描述,并提供更好的解决方案.

题:

为简单起见,我们要求前缀和后缀非空并且比整个字符串S短.字符串S的边界是任何前缀和后缀的字符串.例如,“cut”是字符串“cutletcut”的边框,字符串“barbararhubarb”有两个边框:“b”和“barb”.

class Solution { public int solution(String S); }

在给定由N个字符组成的字符串S的情况下,返回其最长边界的长度,该边界在给定字符串中至少有三次非重叠出现.如果S中没有这样的边界,则该函数应返回0.

例如,

>如果S =“barbararhubarb”,则函数应返回1,如上所述;
>如果S =“ababab”,则函数应返回2,因为“ab”和“abab”都是S的边界,但只有“ab”有三个非重叠的出现;
>如果S =“baaab”,则该函数应返回0,因为其唯一的边界“b”仅出现两次.

假使,假设:

> N是[0..1,000,000]范围内的整数;
>字符串S仅由小写字母(a-z)组成.

复杂:

>预期的最坏情况时间复杂度为O(N);
>预期的最坏情况空间复杂度是O(N)(不计算输入参数所需的存储空间).

def solution(S):
    S = S.lower()
    presuf = []
    f = l = str()
    rank = []
    wordlen = len(S)
    for i,j in enumerate(S):
        y = -i-1
        f += S[i]
        l = S[y] + l
        if f==l and f != S:
            #print f,l
            new=S[i+1:-i-1]
            mindex = new.find(f)
            if mindex != -1:
                mid = f #new[mindex]
                #print mid
            else:
                mid = None
            presuf.append((f,mid,l,(i,y)))
    #print presuf
    for i,j,k,o in presuf:
        if o[0]<wordlen+o[-1]: #non overlapping
            if i==j:
                rank.append(len(i))
            else:
                rank.append(0)
    if len(rank)==0:
        return 0
    else:
        return max(rank)

我的解决方案时间复杂度为:O(N2)或O(N4)
非常感谢.

解决方法

我的解决方案是rabin-Karp和knuth-Morris-Pratt算法的结合.
http://codility.com/cert/view/certB6J4FV-W89WX4ZABTDRVAG6/details

python 创建日期范围

python 创建日期范围

def mkurl(self):
        def create_assist_date(datestart=None, dateend=None):
            if datestart is None:
                datestart = ''2016-01-01''
            if dateend is None:
                dateend = datetime.datetime.now().strftime(''%Y-%m-%d'')
            # 转为日期格式
            datestart = datetime.datetime.strptime(datestart, ''%Y-%m-%d'')
            dateend = datetime.datetime.strptime(dateend, ''%Y-%m-%d'')
            date_list = []
            date_list.append(datestart.strftime(''%Y-%m-%d''))
            while datestart < dateend:
                # 日期叠加一天
                datestart += datetime.timedelta(days=+1)
                # 日期转字符串存入列表
                date_list.append(datestart.strftime(''%Y-%m-%d''))

            return [i.replace(''-'', '''') for i in date_list]

        for i in create_assist_date("2018-12-31", "2020-01-01"):
            yield self.listurl.format(i)

我们今天的关于在Python中查找日期范围重叠在python中查找日期范围重叠怎么办的分享就到这里,谢谢您的阅读,如果想了解更多关于Flutter Firebase查询过滤器的日期范围与另一个日期范围重叠、php-需要查看日期范围是否与sql中的另一个日期范围重叠、python – 在字符串中查找重叠和非重叠子串的数量、python 创建日期范围的相关信息,可以在本站进行搜索。

本文标签: