2016-08-03 75 views
3

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

首先我创建一个新的变量,在这里我可以识别连续天数为假的错误。

weatherFile['CONSECUTIVE_DAY'] = 'NA' 

我已经转换日期,datetime对象然后顺序的:

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) 

这导致类型错误:unhashable类型。追溯发生在第二行。 weatherFile ['DATE_INT']是dtype:int64。

回答

3

您可以使用.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。

+0

哇 - 非常感谢。我一整天都在努力弄清楚这一点,而且效果很好!非常感谢。 – Justin

1

一旦你有序号这是一个简单的任务,在这里我使用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被删除。

+0

感谢您的回应 - 我了解您的解决方案并确认您的示例作品。尽管当我尝试将其应用于我的场景时,我得到一个TypeError:不可取的类型。我会用我尝试的解决方案更新我的问题,也许您可​​以帮助我了解我出错的地方。 – Justin