这是数据框 1。
index date Count
4 2021-01-08 07:52:18 1
3 2021-01-08 08:53:34 10
0 2021-01-09 07:56:54 12
5 2021-01-09 09:52:17 13
1 2021-01-12 07:55:58 5
这是数据框 2
date Count
2021-01-08 07:52:00 0
2021-01-08 07:53:00 0
2021-01-08 07:54:00 0
2021-01-08 07:55:00 0
2021-01-08 07:56:00 0
... ...
2021-01-14 08:45:00 0
2021-01-14 08:46:00 0
2021-01-14 08:47:00 0
2021-01-14 08:48:00 0
2021-01-14 08:49:00 0
[8698 rows x 1 columns]
我需要将第一个数据帧计数值置于第二个数据帧计数中。 从数据帧 1 中读取值并在数据帧 2 中搜索。如果找到则替换计数值。
但问题是第一个数据帧中的“seconds
”值。无论如何在比较时忽略它。 (我可以制作逻辑,但我需要一些快速的方法,也许是 Python 或 Pandas 中的内置函数)
答案 0 :(得分:1)
正如@anky 所建议的,您可以将日期放在 df 上,因为这是一个较小的数据框。然后合并数据。
import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
'2021-01-09 07:56:54','2021-01-09 09:52:17',
'2021-01-12 07:55:58'],
'count':[1,10,12,13,5]})
df2 = pd.DataFrame({'date':pd.date_range('2021-01-08 07:52:00',periods=9000,freq='T'),
'count':[0]*9000})
print (df2)
df1['date'] = pd.to_datetime(df1['date'])
df1['date_str'] = df1['date'].dt.floor('T')
df2 = df2.merge(df1[['date_str','count']],left_on='date',right_on='date_str', how='left')
df2.drop(columns=['date_str','count_x'],inplace=True)
df2.rename(columns={'count_y':'count'},inplace=True)
print (df2)
输出结果为:
df1:
date count date_str
0 2021-01-08 07:52:18 1 2021-01-08 07:52:00
1 2021-01-08 08:53:34 10 2021-01-08 08:53:00
2 2021-01-09 07:56:54 12 2021-01-09 07:56:00
3 2021-01-09 09:52:17 13 2021-01-09 09:52:00
4 2021-01-12 07:55:58 5 2021-01-12 07:55:00
df2:与df1合并后
date count
0 2021-01-08 07:52:00 1.0
1 2021-01-08 07:53:00 NaN
2 2021-01-08 07:54:00 NaN
3 2021-01-08 07:55:00 NaN
4 2021-01-08 07:56:00 NaN
... ... ...
8995 2021-01-14 13:47:00 NaN
8996 2021-01-14 13:48:00 NaN
8997 2021-01-14 13:49:00 NaN
8998 2021-01-14 13:50:00 NaN
8999 2021-01-14 13:51:00 NaN
答案 1 :(得分:1)
如果您运行 df1 并在几分钟内重新采样,它将从最小日期和时间向上采样到最大日期和时间。如果您通过 df2 的索引重新索引它,您将获得所需的输出。我从@Joe Ferndz 借用了一些代码来创建数据
import pandas as pd
df1 = pd.DataFrame({'date':['2021-01-08 07:52:18','2021-01-08 08:53:34',
'2021-01-09 07:56:54','2021-01-09 09:52:17',
'2021-01-12 07:55:58'],
'count':[1,10,12,13,5]})
df1['date'] = pd.to_datetime(df1['date'])
df1.set_index('date', inplace=True)
df1 = df1.resample('min').sum()
d_range = pd.date_range('2021-01-08 07:52:00', '2021-01-14 08:49:00', freq='1min')
df2 = pd.DataFrame(index=d_range)
df1 = df1.reindex(df2.index, fill_value=0)
df1
count
2021-01-08 07:52:00 1
2021-01-08 07:53:00 0
2021-01-08 07:54:00 0
2021-01-08 07:55:00 0
2021-01-08 07:56:00 0
... ...
2021-01-14 08:45:00 0
2021-01-14 08:46:00 0
2021-01-14 08:47:00 0
2021-01-14 08:48:00 0
2021-01-14 08:49:00 0