我想在数据帧中识别连续的日期,也就是说,存在直接的前任或继任者。然后,我想在一个新的列中标记哪些日期是连续的,哪些日期不是连续的。此外,我想在我的数据的特定子集内进行此操作。
首先,我创建了一个新的变量,在这里我可以识别连续几天的True或False。
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'])
我正在考虑循环浏览这些组,并应用一个操作来识别哪些日子是连续的,哪些日子不是,在唯一的县内,临时子集。
我对编程和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:不可处理的类型。回溯发生在第二行。weatherFile['DATE_INT']是dtype:int64。
您可以使用.shift(-1)或.shift
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
如果条目前面或后面有连续日期,则将CONSUCTIVE_DAY设置为TRUE。
一旦你有了序数,这是一项微不足道的任务,这里我使用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。