Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在日期间隔内添加缺少的日期?_Python_Python 3.x_Pandas_Dataframe_Pandas Groupby - Fatal编程技术网

Python 如何在日期间隔内添加缺少的日期?

Python 如何在日期间隔内添加缺少的日期?,python,python-3.x,pandas,dataframe,pandas-groupby,Python,Python 3.x,Pandas,Dataframe,Pandas Groupby,我有一个如下所示的数据帧 df = pd.DataFrame({ 'subject_id':[1,1,1,1,1,1,1,2,2,2,2,2], 'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-05 12:59:00','2173-05-04 13:14:00','2173-05-05 13:37:00','2173-07-06 13:39:00','2173-07-08

我有一个如下所示的数据帧

df = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,2,2,2,2,2],
'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-05 
          12:59:00','2173-05-04 13:14:00','2173-05-05 13:37:00','2173-07-06 
          13:39:00','2173-07-08 11:30:00','2173-04-08 16:00:00','2173-04-09 
          22:00:00','2173-04-11 04:00:00','2173- 04-13 04:30:00','2173-04-14 08:00:00'],
 'val' :[5,5,5,5,1,6,5,5,8,3,4,6]})
 df['time_1'] = pd.to_datetime(df['time_1'])
 df['day'] = df['time_1'].dt.day
 df['month'] = df['time_1'].dt.month
正如您可以从上面的数据框中看到的,在这两个日期之间几乎没有缺失的日期我想为这些日期创建新记录,并填写前一行的值

def dt(df):
   r = pd.date_range(start=df.date.min(), end=df.date.max())
   df.set_index('date').reindex(r)

new_df = df.groupby(['subject_id','month']).apply(dt)
这将生成所有日期。我只想在每个月的每个主题的输入日期间隔内找到缺少的日期

我确实试过这个代码。虽然它对我有所帮助,但并没有让我获得这个更新/新需求的预期输出。当我们离开连接时,它复制所有记录。我也不能进行内部联接,因为它将删除不匹配的列。我想要左连接和内连接的混合

目前,它为一年中所有365天创建了新记录,这是我不想要的。像下面这样。这是预料不到的

我只希望在输入日期间隔之间添加缺失的日期,如下所示。例如,主题=1,在第4个月有第3个月和第5个月的记录。但第四名不见了。所以我们增加了第四天的记录。我们不需要第六,第七等不同的电流输出。同样在第7个月,记录第7天缺失。因此,我们只需为此添加一项新记录

我希望我的输出如下所示

df = pd.DataFrame({
'subject_id':[1,1,1,1,1,1,1,2,2,2,2,2],
'time_1' :['2173-04-03 12:35:00','2173-04-03 12:50:00','2173-04-05 
          12:59:00','2173-05-04 13:14:00','2173-05-05 13:37:00','2173-07-06 
          13:39:00','2173-07-08 11:30:00','2173-04-08 16:00:00','2173-04-09 
          22:00:00','2173-04-11 04:00:00','2173- 04-13 04:30:00','2173-04-14 08:00:00'],
 'val' :[5,5,5,5,1,6,5,5,8,3,4,6]})
 df['time_1'] = pd.to_datetime(df['time_1'])
 df['day'] = df['time_1'].dt.day
 df['month'] = df['time_1'].dt.month

这里有一个问题,您需要为追加新天数重新采样,所以这是必要的

df['time_1'] = pd.to_datetime(df['time_1'])
df['day'] = df['time_1'].dt.day
df['date'] = df['time_1'].dt.floor('d')

df1 = (df.set_index('date')
         .groupby('subject_id')
         .resample('d')
         .last()
         .index
         .to_frame(index=False))
print (df1)
     subject_id       date
0             1 2173-04-03
1             1 2173-04-04
2             1 2173-04-05
3             1 2173-04-06
4             1 2173-04-07
..          ...        ...
99            2 2173-04-10
100           2 2173-04-11
101           2 2173-04-12
102           2 2173-04-13
103           2 2173-04-14

[104 rows x 2 columns]
想法是删除不必要的缺失行-您可以为最小连续误报值创建阈值(此处为5)并删除行(为轻松测试创建新列):

编辑:每月使用
reindex
的解决方案:

df['time_1'] = pd.to_datetime(df['time_1'])
df['day'] = df['time_1'].dt.day
df['date'] = df['time_1'].dt.floor('d')
df['month'] = df['time_1'].dt.month



这里有一个问题,您需要
重新采样
以追加新的天数,所以这是必要的

df['time_1'] = pd.to_datetime(df['time_1'])
df['day'] = df['time_1'].dt.day
df['date'] = df['time_1'].dt.floor('d')

df1 = (df.set_index('date')
         .groupby('subject_id')
         .resample('d')
         .last()
         .index
         .to_frame(index=False))
print (df1)
     subject_id       date
0             1 2173-04-03
1             1 2173-04-04
2             1 2173-04-05
3             1 2173-04-06
4             1 2173-04-07
..          ...        ...
99            2 2173-04-10
100           2 2173-04-11
101           2 2173-04-12
102           2 2173-04-13
103           2 2173-04-14

[104 rows x 2 columns]
想法是删除不必要的缺失行-您可以为最小连续误报值创建阈值(此处为5)并删除行(为轻松测试创建新列):

编辑:每月使用
reindex
的解决方案:

df['time_1'] = pd.to_datetime(df['time_1'])
df['day'] = df['time_1'].dt.day
df['date'] = df['time_1'].dt.floor('d')
df['month'] = df['time_1'].dt.month


这有用吗

def fill_dates(df):
    result = pd.DataFrame()
    for i,row in df.iterrows():
        if i == 0:
            result = result.append(row)
        else:
            start_date = result.iloc[-1]['time_1']
            end_date = row['time_1']
#            print(start_date, end_date)
            delta = (end_date - start_date).days
#            print(delta)
            if delta > 0 and start_date.month == end_date.month:
                for j in range(delta):
                    day = start_date + timedelta(days=j+1)
                    new_row = result.iloc[-1].copy()
                    new_row['time_1'] = day
                    new_row['remarks'] = 'added'
                    if new_row['time_1'].date() != row['time_1'].date():
                        result = result.append(new_row)
                result = result.append(row)
            else:
                result = result.append(row)
    result.reset_index(inplace = True)
    return result
这有用吗

def fill_dates(df):
    result = pd.DataFrame()
    for i,row in df.iterrows():
        if i == 0:
            result = result.append(row)
        else:
            start_date = result.iloc[-1]['time_1']
            end_date = row['time_1']
#            print(start_date, end_date)
            delta = (end_date - start_date).days
#            print(delta)
            if delta > 0 and start_date.month == end_date.month:
                for j in range(delta):
                    day = start_date + timedelta(days=j+1)
                    new_row = result.iloc[-1].copy()
                    new_row['time_1'] = day
                    new_row['remarks'] = 'added'
                    if new_row['time_1'].date() != row['time_1'].date():
                        result = result.append(new_row)
                result = result.append(row)
            else:
                result = result.append(row)
    result.reset_index(inplace = True)
    return result

请在帖子中添加您当前的解决方案,以便帮助我们更好地理解问题。如果投反对票的人提供一些评论,将对我们有所帮助。请在帖子中添加您当前的解决方案,以便帮助我们更好地理解问题。如果投反对票的人提供一些评论,将对我们有所帮助。我们现在再试一次。向上投票。是否可以为每个月的每个主题找到
min
max',因此我们可以使用
difference`方法添加缺少的日期。类似于这样的
idx=pd.period\u范围(最小(df.date),最大(df.date))
因此我们将获得主题=1,第4个月的
min
日期为
2173-04-03
,最大日期为
2173-04-05
。现在我们只需要在两者之间添加缺少的
2173-04-04
。只是问一下。不管怎样,我认为这是一个有效的解决方案。然而,我认为应该有一种方法来做到这一点,即每个月对每个主题采用
min
max
方法。谢谢你的帮助。我还更新了我正在努力做的事情。你能帮忙吗?谢谢你的帮助。非常感谢。嗨,另一个简短的问题。我看到一些记录没有添加日期。相反,它保持为
NA
将立即尝试。向上投票。是否可以为每个月的每个主题找到
min
max',因此我们可以使用
difference`方法添加缺少的日期。类似于这样的
idx=pd.period\u范围(最小(df.date),最大(df.date))
因此我们将获得主题=1,第4个月的
min
日期为
2173-04-03
,最大日期为
2173-04-05
。现在我们只需要在两者之间添加缺少的
2173-04-04
。只是问一下。不管怎样,我认为这是一个有效的解决方案。然而,我认为应该有一种方法来做到这一点,即每个月对每个主题采用
min
max
方法。谢谢你的帮助。我还更新了我正在努力做的事情。你能帮忙吗?谢谢你的帮助。非常感谢。嗨,另一个简短的问题。我看到一些记录没有添加日期。相反,它仍然是
NA
,我不能在数据集上使用for循环。尽管如此,我还是对你们的努力和时间投了赞成票。我不能在我的数据集上使用for循环。尽管如此,我还是对你的努力和时间投了赞成票。