我有两个数据帧:df_p
和df_d
。
df_p
包含8760个条目,它代表1年的记录和1小时的分辨率。
date
是日期时间列,hy
是(一年中的小时数),profile
是一个值
hy profile
date
1900-01-01 00:00:00 0 0.030908
1900-01-01 01:00:00 1 0.030053
1900-01-01 02:00:00 2 0.043185
1900-01-01 03:00:00 3 0.048040
1900-01-01 04:00:00 4 0.070803
1900-01-01 05:00:00 5 0.070948
... ... ...
1900-12-31 19:00:00 8755 0.058093
1900-12-31 20:00:00 8756 0.030908
1900-12-31 21:00:00 8757 0.030053
1900-12-31 22:00:00 8758 0.043185
1900-12-31 23:00:00 8759 0.048040
df_d
包含365个条目,代表1年的记录和1天的分辨率。
date
是日期时间列,HDD
是一整天有效的值。
date HDD
1900-01-01 9.823750
1900-01-02 7.747917
1900-01-03 5.198750
1900-01-04 7.547500
1900-01-05 9.755000
...
1900-12-25 8.549129
1900-12-26 8.245625
1900-12-27 7.641417
1900-12-28 6.176417
1900-12-29 6.368917
1900-12-30 6.443333
1900-12-31 7.224583
我想要做的是在df_p
数据框中创建一个新列,该列在一天中的每个小时中的值分别为HDD
。
以下是所需输出的示例:
hy profile HDD
date
1900-01-01 00:00:00 0 0.030908 9.823750
1900-01-01 01:00:00 1 0.030053 9.823750
1900-01-01 02:00:00 2 0.043185 9.823750
1900-01-01 03:00:00 3 0.048040 9.823750
1900-01-01 04:00:00 4 0.070803 9.823750
1900-01-01 05:00:00 5 0.070948 9.823750
... ... ...
1900-12-31 19:00:00 8755 0.058093 7.224583
1900-12-31 20:00:00 8756 0.030908 7.224583
1900-12-31 21:00:00 8757 0.030053 7.224583
1900-12-31 22:00:00 8758 0.043185 7.224583
1900-12-31 23:00:00 8759 0.048040 7.224583
谢谢您的帮助。
答案 0 :(得分:3)
使用merge_asof
:
#if necessary convert to datetimes
df_d['date'] = pd.to_datetime(df_d['date'])
df_p.index = pd.to_datetime(df_p.index)
df = pd.merge_asof(df_p, df_d, left_index=True, right_on='date')
print (df)
hy profile date HDH
0 0 0.030908 1900-01-01 9.823750
0 1 0.030053 1900-01-01 9.823750
0 2 0.043185 1900-01-01 9.823750
0 3 0.048040 1900-01-01 9.823750
0 4 0.070803 1900-01-01 9.823750
0 5 0.070948 1900-01-01 9.823750
11 8755 0.058093 1900-12-31 7.224583
11 8756 0.030908 1900-12-31 7.224583
11 8757 0.030053 1900-12-31 7.224583
11 8758 0.043185 1900-12-31 7.224583
11 8759 0.048040 1900-12-31 7.224583
最后删除列date
使用DataFrame.drop
:
df = df.drop('date', axis=1)
答案 1 :(得分:2)
IIUC,您可以使用pd.DateTimeIndex和map
中的floor
方法:
df_p = pd.DataFrame({'hy':np.arange(365*24),
'profile':np.random.random(365*24)},
index=pd.date_range('2019-01-01',
periods=365*24,
freq='H'))
df_p = df_p.rename_axis('date')
df_d = pd.DataFrame({'HDH': np.random.random(365)*24},
index=pd.date_range('2019-01-01', periods=365, freq='D'))
df_p['HDD'] = df_p.index.floor('D').map(df_d['HDH'])
df_p
输出:
hy profile HDD
date
2019-01-01 00:00:00 0 0.293717 20.049268
2019-01-01 01:00:00 1 0.573874 20.049268
2019-01-01 02:00:00 2 0.976042 20.049268
2019-01-01 03:00:00 3 0.970939 20.049268
2019-01-01 04:00:00 4 0.178653 20.049268
... ... ... ...
2019-12-31 19:00:00 8755 0.711155 23.694213
2019-12-31 20:00:00 8756 0.600364 23.694213
2019-12-31 21:00:00 8757 0.708122 23.694213
2019-12-31 22:00:00 8758 0.926454 23.694213
2019-12-31 23:00:00 8759 0.612455 23.694213
[8760 rows x 3 columns]
all(df_p.index.floor('D') == df_p.index.normalize())
True
%timeit df_p.index.floor('D')
384 µs±24.6 µs每个循环(平均值±标准偏差,共运行7次,循环1000次 每个)
%timeit df_p.index.normalize()
每个循环530 µs±11.3 µs(平均±标准偏差,共运行7次,循环1000次 每个)