我想确定数据框中连续的日期,即存在直接前任或后继者。然后,我想在新列中标记哪些日期是连续的,哪些日期不连续。另外,我想在我的数据的特定子集中执行此操作。
首先我创建一个新变量,我连续几天识别出假的真假。
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)
这导致TypeError:unhashable类型。回溯发生在第二行。 weatherFile [' DATE_INT']是dtype:int64。
答案 0 :(得分: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。
答案 1 :(得分: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被删除。