我有一个包含不同数据时间列的数据框,每个列旁边都有一个“值”列,其中包含在每个日期时间测量的值。正如您所看到的,某些值并不是每秒都测量的:
我的目标是获取一个只有一个日期时间列作为索引(例如 Datetime1)的 DataFrame,并使所有“值”列与其匹配。对于不存在的值,我想输入最后注册的值。
例如,我想获取它作为我的结果数据帧:
我感兴趣的另一个选项是做相反的事情:将我的 Datetime 2 列设置为索引并删除多余的行。
请记住,这是一个简化的示例。我的数据框中至少有 10 个日期时间值列对。 我想将最长的或最短的设置为索引。
有什么想法吗?
非常感谢!
Python 3.11.2
最佳答案
让我们在这里尝试左合并:
(df.iloc[:,:2]
.rename({'Datetime 1': 'Datetime'}, axis=1)
.merge(df.iloc[:,2:].rename({'Datetime 2': 'Datetime'}, axis=1), how='left')
.ffill())
Datetime Value 1 Value 2
0 2023-01-01 10:00:00 2 5
1 2023-01-01 10:00:01 10 5
2 2023-01-01 10:00:02 15 5
3 2023-01-01 10:00:03 6 1
4 2023-01-01 10:00:04 2 1
5 2023-01-01 10:00:05 10 1
6 2023-01-01 10:00:06 15 10
7 2023-01-01 10:00:07 6 8
这个想法是获取前两列并与最后两列执行左合并。然后最后向前填充缺失值。
我已重命名日期时间列,因此输出中只有一个日期时间列。如果您想要明确,还可以在合并时指定 on='Datetime'
。
当事先未知列数时,您仍然可以按两对进行切片并执行基于索引的连接
:
df_list = [
(df.iloc[:,i:i+2]
.set_index(df.columns[i])
.rename_axis('Datetime'))
for i in range(0, df.shape[1], 2)
]
(df_list[0].join(df_list[1:])
.dropna(axis=0, how='all')
.ffill()
.reset_index())
Datetime Value 1 Value 2
0 2023-01-01 10:00:00 2 5
1 2023-01-01 10:00:01 10 5
2 2023-01-01 10:00:02 15 5
3 2023-01-01 10:00:03 6 1
4 2023-01-01 10:00:04 2 1
5 2023-01-01 10:00:05 10 1
6 2023-01-01 10:00:06 15 10
7 2023-01-01 10:00:07 6 8
df.join
支持一次合并多个 DataFrame,因此是此类操作的首选。
关于python - 在具有多个具有不同值的日期时间列的 DataFrame 中设置日期时间索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76110683/