Pandas - 合并具有时差的行(当 datetime 为索引时)

Posted

技术标签:

【中文标题】Pandas - 合并具有时差的行(当 datetime 为索引时)【英文标题】:Pandas - Merging rows with time difference (When datetime is index) 【发布时间】:2020-12-29 19:20:49 【问题描述】:

我找到了一些任务要做,以便更多地使用 Pandas 开发自己,但我在使用的数据文件中发现了一些意外错误。实际上想自己修复它,但我不知道如何。

基本上我有一个 excel 文件,包含列 - PayType、Money、Date。在 PayType 栏中,我有 4 种不同的付款方式。汽车租金支付,汽车服务费支付,以及另外2个不重要的。基本上,在每次支付汽车租金时,都会自动扣除服务费,同时发生。我使用 Pivot 表并将 PayTypes 划分为列,因为我想计算这些费用的百分比。

数据透视表之前: enter image description here

时差示例: enter image description here

数据透视表之后: enter image description here

import numpy as np
import pandas as pd
import xlrd
from pandas import Series, DataFrame

 df = pd.read_excel ('C:/Data.xlsx', sheet_name = 'Sheet1',
                usecols = ['PayType', 'Money', 'Date'])

 df['Date'] = pd.to_datetime(df['Date'], format = '%Y-%m-%d %H:$M:%S.%f')

 df = df.pivot_table(index = ['Date'],
                columns = ['PayType']).fillna(0)

 df = pd.merge_asof(df['Money', 'serviceFee'], df['Money', 'carRenting'], on = 'Date', tolerance = 
      pd.Timedelta('2s'))

 df['Percentage'] = df['Money','serviceFee'] / df['Money','carRenting'] * 100
 df['Percentage'] = df['Percentage'].abs()

 df['Charges'] = np.where(df['Percentage'].notna(), np.where(df['Percentage'] > 26, 'Overcharge - 
                 30%', 'Fixed - 25%'), 'Null')


 df.to_excel("Finale123.xlsx")

所以在数据透视表中,租车和费用支付的条目几乎都发生在同一时刻,因此它们的时间相等并且它们在一行中。但是很少有错误,只是1或2秒的租车和付费时间不同。因为这个时间差,它们被分成了2个不同的行。

我尝试使用merge_asof,但没有成功。

如何合并 2 行,它们有不同的时间(最多 2 秒),而且这个时间列(日期)是数据透视表的实际索引。

【问题讨论】:

你能显示你的输入和输出样本吗? @Johnny 当然,我现在添加 【参考方案1】:

我遇到了类似的问题。我需要合并多个传感器的时间序列数据。传感器测量的时间间隔为 5 秒。时间格式为 yyyy:MM:dd HH:mm:ss。要进行合并,我还需要对用于合并的列进行排序。

sensors_livingroom = load(filename_livingroom)
sensors_bedroom = load(filename_bedroom)

sensors_livingroom = sensors_livingroom.set_index("time")
sensors_bedroom = sensors_bedroom.set_index("time")

sensors_livingroom.index = pd.to_datetime(sensors_livingroom.index, dayfirst=True)
sensors_bedroom.index = pd.to_datetime(sensors_bedroom.index, dayfirst=True)

sensors_livingroom.sort_index(inplace=True)
sensors_bedroom.sort_index(inplace=True)

sensors = pd.merge_asof(sensors_bedroom, sensors_livingroom, on='time', direction="nearest")

在我的例子中,我想合并到最近的时间值,所以我将参数方向设置为最近。在您的情况下,一个数据帧的时间似乎总是小于另一个数据帧的时间,因此将方向参数设置为向前或向后可能会更好。见https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge_asof.html

【讨论】:

以上是关于Pandas - 合并具有时差的行(当 datetime 为索引时)的主要内容,如果未能解决你的问题,请参考以下文章

Pandas DataFrame:合并具有相同 ID 的行

Pandas 将具有多个值的行数据合并到列的 Python 列表中

如何组合 pandas df 以便可以合并具有置换 col1 和 col2 值的行,其中仅包含一个组合并汇总计数列

将列中具有相同值的行合并在一起

将具有相同值的多行合并为pandas中的一行

当数据集的列具有不同的行数时合并它们