【问题标题】:How to identify consecutive dates如何识别连续日期
【发布时间】:2016-08-03 21:18:51
【问题描述】:

我想确定数据框中连续的日期,即存在直接的前任或后继。然后,我想在新列中标记哪些日期是连续的,哪些不是连续的。此外,我想在我的数据的特定子集中执行此操作。

首先,我创建一个新变量,我将在其中连续几天识别真假。

weatherFile['CONSECUTIVE_DAY'] = 'NA'   

我已将日期转换为日期时间对象,然后转换为序数对象:

weatherFile['DATE_OBJ'] = [datetime.strptime(d, '%Y%m%d') for d in weatherFile['DATE']]
weatherFile['DATE_INT'] = list([d.toordinal() for d in weatherFile['DATE_OBJ']])

现在我想确定以下组中的连续日期:

weatherFile.groupby(['COUNTY_GEOID_YEAR', 'TEMPBIN'])

我正在考虑循环遍历这些组并应用一个操作来识别在唯一县的 tempbin 子集中哪些天是连续的,哪些不是连续的。

我对编程和 python 还很陌生,到目前为止,这是一个好方法吗?如果是,我该如何进步?

谢谢 - 如果我应该提供更多信息,请告诉我。

更新:

使用@karakfa 的建议,我尝试了以下方法:

weatherFile.groupby(['COUNTY_GEOID_YEAR', 'TEMPBIN'])
weatherFile['DISTANCE'] = weatherFile[1:, 'DATE_INT'] - weatherFile[:-1,'DATE_INT']
weatherFile['CONSECUTIVE?'] = np.logical_or(np.insert((weatherFile['DISTANCE']),0,0) == 1, np.append((weatherFile['DISTANCE']),0) == 1)

这会导致 TypeError: unhashable type。 Traceback 发生在第二行。 weatherFile['DATE_INT'] 是 dtype:int64。

【问题讨论】:

    标签: python datetime pandas


    【解决方案1】:

    您可以使用 .shift(-1) 或 .shift(1) 来比较连续的条目:

    df.loc[df['DATE_INT'].shift(-1) - df['DATE_INT'] == 1, 'CONSECUTIVE_DAY'] = True
    

    如果前一个条目是前一天,则将 CONSECUTIVE_DAY 设置为 TRUE

    df.loc[(df['DATE_INT'].shift(-1) - df['DATE_INT'] == 1) | (df['DATE_INT'].shift(1) - df['DATE_INT'] == -1), 'CONSECUTIVE_DAY'] = True
    

    如果条目之前或之后是连续日期,则将 CONSECUTIVE_DAY 设置为 TRUE。

    【讨论】:

    • 哇——非常感谢。我整天都在努力解决这个问题,而且效果很好!非常感谢。
    【解决方案2】:

    一旦你有了序数,这是一项微不足道的任务,这里我使用 numpy 数组来提出一个替代方案

    a=np.array([1,2,4,6,7,10,12,13,14,20])
    d=a[1:]-a[:-1]                                            # compute delta
    ind=np.logical_or(np.insert(d,0,0)==1,np.append(d,0)==1)  # at least one side matches
    a[ind]                                                    # get matching entries
    

    为您提供有连续数字的数字

    array([ 1,  2,  6,  7, 12, 13, 14])
    

    即删除4、10和20。

    【讨论】:

    • 感谢您的回复 - 我了解您的解决方案并确认您的示例有效。虽然当我尝试将它应用于我的场景时,我得到一个 TypeError: unhashable type。我会用我尝试的解决方案更新我的问题,也许你可以帮忙看看我哪里出错了。
    猜你喜欢
    • 2012-07-10
    • 1970-01-01
    • 2021-08-19
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2011-03-10
    相关资源
    最近更新 更多