我有这个df,这是一个来自实际的样本.每行表示以大约20分钟的间隔和几个其他列进行的测量.

                   datetime        value
261     2022-10-21 02:00:13     0.164299
262     2022-10-21 02:20:12     0.163009
263     2022-10-21 02:40:14     0.162298
264     2022-10-21 03:00:12     0.162846
265     2022-10-24 08:46:38     1.788360
266     2022-10-24 09:06:47     1.442915
267     2022-10-24 09:27:28     1.246774
268     2022-10-24 09:46:58     0.194352

如你所见,2022-10-21 03:00:122022-10-24 08:46:38之间存在差距.我需要一种方法,首先确定差距在哪里(可能有n个),然后用适当的日期填充这些行,并用NaN填充相应的值.

现在,我将按如下方式生成缺少的日期:

# number of periods of 20 minutes between dates  
periods = (df.iloc[265,0] - df.iloc[264,0]).total_seconds() / 60.0 / 20

# dates to fill gap
pd.date_range(df.iloc[264,0], df.iloc[265,0], periods=periods)

你知道怎么做吗?

编辑:预期输出(我不需要我在新行上添加的完全相同的分钟数,它们只是为了参考整体 idea )

                   datetime        value
261     2022-10-21 02:00:13     0.164299
262     2022-10-21 02:20:12     0.163009
263     2022-10-21 02:40:14     0.162298
264     2022-10-21 03:00:12     0.162846
265     2022-10-21 03:20:00     NaN
266     2022-10-21 03:40:00     NaN
            ...
n-4     2022-10-24 08:26:00     NaN
n-3     2022-10-24 08:46:38     1.788360
n-2     2022-10-24 09:06:47     1.442915
n-1     2022-10-24 09:27:28     1.246774
n       2022-10-24 09:46:58     0.194352

推荐答案

try (可能不是最干净的解决方案-它会try 找出差距&>40分钟,然后用NaN个值添加20分钟间隔):

mask = df["datetime"].diff() > "40 minutes"

dfs = []
for idx, row in df[mask].iterrows():
    prev_time = df.loc[idx - 1, "datetime"]
    dr = pd.date_range(
        prev_time + pd.Timedelta("20 minutes"),
        row["datetime"] - pd.Timedelta("20 minutes"),
        freq="20min",
    )
    dfs.append(
        pd.DataFrame(
            [{"datetime": dr}],
            index=[idx - 1],
        )
    )

df = pd.concat([df, *dfs]).sort_index().explode("datetime")
print(df)

打印:

               datetime     value
261 2022-10-21 02:00:13  0.164299
262 2022-10-21 02:20:12  0.163009
263 2022-10-21 02:40:14  0.162298
264 2022-10-21 03:00:12  0.162846
264 2022-10-21 03:20:12       NaN
264 2022-10-21 03:40:12       NaN

...

264 2022-10-24 08:00:12       NaN
264 2022-10-24 08:20:12       NaN
265 2022-10-24 08:46:38  1.788360
266 2022-10-24 09:06:47  1.442915
267 2022-10-24 09:27:28  1.246774
268 2022-10-24 09:46:58  0.194352

Python-3.x相关问答推荐

需要使用regex匹配字符串的帮助,直到最后一次出现开闭括号,开闭括号中的值是可选的

数据类对象列表的字典获取方法-在数据类列表中查找具有特定变量值的数据类

如何将参数/值从测试方法传递给pytest的fixture函数?

在Pandas中,根据另一列中的重复值将数据分组为一列

在 groupby 之后,Pandas 在特定类别中获得最常见和最后的值

无法提出给定 for 循环的原因 (Python 3.11)

提高时间复杂度的一些建议

有效地缩短列表,直到第一次和最后一次出现不同于 None 的值

通过最接近的匹配合并两个不同长度的列上的两个数据框

spaCy 中的匹配模式返回空结果

在不使用字符串方法的情况下查找字符串最后一个单词的长度 - Python

如何并行化文件下载?

如何编写可 Select 充当常规函数的 asyncio 协程?

如何在 Python3 中添加带有标志的命令行参数?

如何使用 d.items() 更改 for 循环中的所有字典键?

如何使用 Python 订阅 Websocket API 通道?

将字符串拆分为最大长度 X 的片段 - 仅在空格处拆分

在 linux mint 上安装 python3-venv 模块

同步调用协程

如何从Pandas 中的字符串中提取前8个字符