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循环。尽管如此,我还是对你的努力和时间投了赞成票。