pandas 如何保留多个时间序列的原始条目,并使用插值来填充不同时间测量的NaN值?

jckbn6z7  于 2023-03-11  发布在  其他
关注(0)|答案(1)|浏览(114)

我想为每个ID找到00:00:00之前的最早测量时间和00:00:00之后的最晚测量时间。这样我就可以选择最大重叠开始和结束时间。下面是示例数据:

import pandas as pd
import random

# Create a sample dataframe
df = pd.DataFrame({'timestamp': pd.date_range(start='2022-01-01', end='2022-01-01 23:59', freq='4H')})
df2 = pd.DataFrame({'timestamp': pd.date_range(start='2022-01-01', end='2022-01-01 23:59', freq='5H')})

df['value']= [random.randrange(10, 19) for n in range(len(df))]
df['ID']= [random.randrange(1, 4) for n in range(len(df))]

df2['value']= [random.randrange(10, 19) for n in range(len(df2))]
df2['ID']= [random.randrange(1, 4) for n in range(len(df2))]

merged_df = df.merge(df2,  how='outer', on =['timestamp'])
# Pivot the dataframe to create a new dataframe with all time measurements for each ID
#merged_df = pd.pivot_table(df, values='value', index=['ID', 'timestamp'], aggfunc='sum')

# Reset the index to create a regular dataframe
merged_df.reset_index(drop=True,inplace=True)

# sort by time
merged_df.sort_values(by=['timestamp'],inplace=True)

# Print the result
print(merged_df)

我有两个不同的时间序列,它们的测量是每20分钟进行一次,另一个是每15分钟进行一次。

我的期望是在合并的 Dataframe 中保留VALUE_1列的原始测量值。此外,我想为没有VALUE_1条目的记录时间插入值。由于df 1每20分钟有一次测量,而df 2每15分钟有一次测量。df 1没有TIME 00:15:00、00:30:00或00:45:00等的VALUE_1列的任何值。df 2每15分钟测量一次,因此它没有00:20:00、00:40:00等的VALUE_1值。如何在保留原始测量值的同时填充和插入这些时间点?
**最小示例:**假设我有这样一个具有不同时间间隔的 Dataframe 。

| 识别号|数值1|时间|
| - ------|- ------|- ------|
| 二十五|五十|00时04分|
| 二十五|八十|00时04分30秒|
| 二十五|一百|00时05分|
| 二十五|一百|00时05分30秒|
| 二十五|一百|00时06分|
| 十八|四十五|00时04分02秒|
| 十八|三十三|00时04分22秒|
| 十八|七十五|00时04分42秒|
| 十八|五十七|00时05分02秒|
| 十八|九十九|00时05分22秒|

预期产出:

| 识别号|数值1|时间|
| - ------|- ------|- ------|
| 二十五|五十|00时04分|
| 二十五|插值值=可能(50+80)/2|00时04分02秒|
| 二十五|插值值|00时04分22秒|
| 二十五|八十|00时04分30秒|
| 二十五|插值值|00时04分42秒|
| 二十五|一百|00时05分|
| 二十五|插值值|00时05分02秒|
| 二十五|插值值|00时05分22秒|
| 二十五|一百|00时05分30秒|
| 二十五|一百|00时06分|
| 十八|插值值=45可能重复最近值|00时04分|
| 十八|四十五|00时04分02秒|
| 十八|三十三|00时04分22秒|
| 十八|一些插值|00时04分30秒|
| 十八|七十五|00时04分42秒|
| 十八|一些插值|00时04分30秒|
| 十八|五十七|00时05分02秒|
| 十八|九十九|00时05分22秒|
| 十八|一些插值|00时05分|
| 十八|一些插值|00时05分30秒|
| 十八|一些插值|00时06分|

**EDIT 1:**如果我只有两个独立的时间序列,我可以在DATE_TIME或TIME合并它们(使用外部合并),这样我就可以保留原始时间记录和来自其他时间序列的记录。然后,我可以只插入它。现在,我试图找出如何对多个时间序列进行插入。

vq8itlhq

vq8itlhq1#

根据我的评论,很难猜测预期的输出会是什么。但这里有一些关于如何将两个DataFrame放在一个公共DateTime索引上,以及如何插入数字列的指针:

# set DATE_TIME as index and keep only numeric columns
a = df.set_index('DATE_TIME').select_dtypes(include=[np.number])
b = df2.set_index('DATE_TIME').select_dtypes(include=[np.number])

# take the union of both indexes
ix = a.index.union(b.index)

# reindex and interpolate
a = a.reindex(ix).interpolate()
b = b.reindex(ix).interpolate()

现在ab都有相同的(不规则的)时间索引,它们保留了它们的初始测量值,缺失的值已通过线性插值填充,例如,对于a

>>> a
                      ID  VALUE1  VALUE2  VALUE3  VALUE4  MODEL  SOLD  INSPECTION
DATE_TIME                                                                        
2022-11-01 00:00:00  3.0   132.0    54.0    81.0    47.0    2.0   1.0         1.0
2022-11-01 00:15:00  2.5   128.5    52.5    89.5    42.5    1.5   0.5         1.0
2022-11-01 00:20:00  2.0   125.0    51.0    98.0    38.0    1.0   0.0         1.0
...                  ...     ...     ...     ...     ...    ...   ...         ...
2022-11-01 23:30:00  2.5   120.5    50.5    96.0    34.0    1.5   0.0         1.0
2022-11-01 23:40:00  3.0   129.0    50.0    93.0    38.0    2.0   0.0         1.0
2022-11-01 23:45:00  3.0   129.0    50.0    93.0    38.0    2.0   0.0         1.0

相关问题