gpt4 book ai didi

python - 将 NaN 值填充到缺少某些时间范围的连续时间序列数据中

转载 作者:行者123 更新时间:2023-11-30 22:45:29 25 4
gpt4 key购买 nike

我的问题的说明

处理每小时变化的时间序列数据,其中包含从 2016-01-01 00:00 到 2016-01-07 23:00 的日期时间以及与每个时间范围相对应的一些特征。

理想情况下,会有 7 x 24 行数据覆盖所有时间段。但有时,每小时的数据可能会因某种原因而中断(例如捕获每小时的天气信息,但网站在特定时间段出现故障。)

我的数据框现在包含所有相同的数据,没有丢失时间。我的数据帧的长度是 7 *24 - 5,这意味着每小时丢失 5 个数据。

日期时间以201601010100格式保存,代表2016-01-01 01:00:00

我的尝试。

我尝试生成长度为 7*24 的新数据帧,其中包含连续的每小时日期时间

data = {"datetime":[],"feature1":[],"feature2":[]}
ff = pd.DataFrame(data)
rng = pd.date_range('01/01/2016', periods=600, freq='H')
new_date = list(rng.strftime('%Y%m%d%H'))
ff['datetime'] = new_date

原始数据帧是df,其中包含datetimefeature1feature2

我尝试 f3 = ff.merge(df, on ='dataframe'')。

但是f3的长度仍然是7*24。

我的目标

由于实际中的时间覆盖范围和特征维度较大,我不想循环两个数据帧并一一比较它们的 datetime.values 。

我想根据 df 中相同的日期时间替换 ff 中特征的值,并保持 NaN 信息不变。

最佳答案

在处理日期/时间索引数据时,丢失数据很常见。没有完美的解决方案 - 完美的解决方案是首先按照您想要的节奏获取所有数据 - 但有一些方法可以管理丢失的数据。

让我们从一些示例数据开始:

import pandas as pd
import numpy as np

data = {"datetime": [201601010100,201601010200,201601010400,201601010500],
"feature1": np.random.randint(1,100,4),
"feature2": np.random.rand(4) }
ff = pd.DataFrame(data)

enter image description here

让我们给它一个真正的DatetimeIndex:

ff.index = pd.to_datetime(ff.datetime.astype(str))
ff.index.name = None

enter image description here

最后使用包含所有时间的类似索引重新索引

di = pd.DatetimeIndex(start=ff.index[0], 
end=ff.index[-1],
freq='H')
ff = ff.reindex(di, fill_value='--missing--')

enter image description here

瞧!您的数据中会明确标记缺失的数据点。作为最后的装饰,您可能决定删除原始的低级时间戳:

del ff['datetime']

产量:

enter image description here

仍有一些复杂性需要担心。 Pandas 并不完美,它很难处理可以包含多种类型的列。它从根本上与 Numpy 数组作为其底层存储引擎联系在一起,这需要同构数组。因此,当您像这样重新索引时,您将 NaN 或其他指定的缺失值引入到其他列中。我为缺失的列选择了一个字符串值,这看起来不错,但会将所有列重新转换为 object 类型,如果您的数据框很大,这会对性能产生影响。默认的替代方案是在缺失值中插入 NaN,会将所有数字列重新转换为浮点型。其中之一可能更适合您。浮点型效果很好,例如,如果所有特征列都已经是浮点值。但两者都不完美。

关于python - 将 NaN 值填充到缺少某些时间范围的连续时间序列数据中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41195995/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com