我有一个pd.DataFrame,它看起来像这样:

                datetime ... month  year seconds
0    2023-03-02 20:59:00 ...     3  2023   75540
1    2023-03-02 20:58:00 ...     3  2023   75480
2    2023-03-02 20:57:00 ...     3  2023   75420
3    2023-03-02 20:56:00 ...     3  2023   75360
4    2023-03-02 20:55:00 ...     3  2023   75300
..                   ... ...   ...   ...     ...
775  2023-03-01 14:34:00 ...     3  2023   52440
776  2023-03-01 14:33:00 ...     3  2023   52380
777  2023-03-01 14:32:00 ...     3  2023   52320
778  2023-03-01 14:31:00 ...     3  2023   52260
779  2023-03-01 14:30:00 ...     3  2023   52200

[780 rows x 11 columns]

DateTime对象只能包含介于14:30:00和20:59:00之间的值.如果某些值超出此范围,则需要删除它们. 此外,两行之间的间隔每次应该正好是60秒,除非是从一天切换到另一天(当df[‘秒’]==52200时).请注意,数据可以跨越多天.

DF的第一行不必是20:59:00,例如,它可以从16:30:00开始.最后一排也是如此,这意味着它并不总是14:30:00. 有些行是随机缺失的,我想将它们添加进go .

DateTime、Month、Year、Second列应该是缺少的时间,而其他列中的值应该取它周围的两行之间的值.比方说,我们有:

                  datetime     x month  year seconds
299    2023-03-02 18:59:00   200     3  2023   68340
300    2023-03-02 18:56:00   230     3  2023   68160

我需要插入两行(因为以秒为单位的差异是180,我们有2分钟缺失).这些行中每一行的x列应该分别是210和220. 我try 使用While循环来实现这一点,但效率非常低--因为我有时会遇到超过400‘000行的df.有没有一种方法可以使用Pandas库或其他方法来实现这一点,而不是迭代每一对行,判断必须包括多少行,然后插入并重置索引?

推荐答案

使用:

#convert to datetime
df['datetime'] = pd.to_datetime(df['datetime'])

#create MultiIndex by dates and seconds columns
out = df.set_index([df['datetime'].dt.normalize(), 'seconds'])

#create full MultiIndex by all combinations of all seconds and all existing dates
mux = pd.MultiIndex.from_product([out.index.levels[0], range(52200, 75540 +60, 60)],
                                 names=['date','seconds'])

#add missing rows
out = out.reindex(mux).reset_index()


#if necessary remove per dates rows before minimal seconds and after maximal seconds
mask = out['datetime'].notna()

out = out[mask.groupby(out['date']).cummax() & 
          mask.iloc[::-1].groupby(out['date'].iloc[::-1]).cummax().iloc[::-1]]

#interpolate x column
out['x'] = out['x'].interpolate()
#extract monts, years, count datetimes from seconds
out['month'] = out['date'].dt.month
out['year'] = out['date'].dt.year
out['datetime'] = out['date'] + pd.to_timedelta(out['seconds'], 'seconds')

Python相关问答推荐

跳过包含某些键的字典

pandas MultiIndex是SQL复合索引的对应物吗?

Python:根据创建时间合并两个收件箱

OdooElectron 商务产品详情页面中add_qty参数动态更新

如何在vercel中指定Python运行时版本?

这家einsum运营在做什么?E = NP.einsum(aj,kl-il,A,B)

拆分pandas列并创建包含这些拆分值计数的新列

如何让 turtle 通过点击和拖动来绘制?

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

Pythind 11无法弄清楚如何访问tuple元素

@Property方法上的inspect.getmembers出现意外行为,引发异常

try 在树叶 map 上应用覆盖磁贴

如何让Flask 中的请求标签发挥作用

有没有一种方法可以从python的pussompy比较结果中提取文本?

在np数组上实现无重叠的二维滑动窗口

在vscode上使用Python虚拟环境时((env))

如何使Matplotlib标题以图形为中心,而图例框则以图形为中心

如果初始groupby找不到满足掩码条件的第一行,我如何更改groupby列,以找到它?

Python避免mypy在相互引用中从另一个类重定义类时失败

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame