根据时间拆分数据帧的行

时间:2017-08-22 09:04:32

标签: python pandas dataframe time

我有一个pandas数据帧df,如下所示:

df
Out[16]: 
  Start     End Value Start Realtime End Realtime Duration
0     0    2999     1         736051       736051    59.98
1  3000  104999     0         736051       736051  5639.98

对于每一行,我需要检查Start RealtimeEnd Realtime列,如果它们是一天(例如。Start Realtime[0] = 29-05-2016 22:30:00End Realtime[0]=30=05-2006 01:00:00我应该拆分排在2:

Start Realtime = 29-05-2016 22:30:00End Realtime = 29-05-2016 23:59:59

之一

Start Realtime = 30-05-2016 00:00:00End Realtime = 30-05-2016 01:00:00

之一

Value列中保留相同的值并重新计算持续时间(以秒为单位)以及startend列(在样本中)

如果我能保持截止时间(在这个例子中是午夜)灵活,那将是很好的。

1 个答案:

答案 0 :(得分:0)

首先要为初学者逐行拍摄。这个想法是,如果你需要拆分一行,然后返回一个有两行的数据帧;否则返回一个数据帧。然后将其附加到您正在创建的新数据框架上。

expanded_df = pd.DataFrame()
for i, row in df.iterrows():
        expanded_df = expanded_df.append(applyFunc(row), ignore_index=True)

对于每一行,创建一个截止时间datetime对象,该对象最接近start_time但在此之后。然后看看它是否落在start_time和end_time之间。最后,如果需要拆分,请创建两个新的pandas系列,以返回更改后的值。

def applyFunc(row):
        start_time = datetime.datetime.fromtimestamp(row["Start Realtime"])
        end_time = # Similar to above

        custom_hour = 11
        # custom_minute = ...

        cutoff_time = # Start with datetime.datetime(start_time.year, start_time.month, start_time.day, custom_hour, 0, 0) and see how you need to adjust with datetime.timedelta(...)

        if start_time < cutoff_time < end_time:
                before_cutoff = # Logic for before_cutoff; you will probably find row.set_value("key", value) useful
                after_cutoff = # Logic for after_cutoff series
                return pd.DataFrame([before_cutoff,after_cutoff])
        else:
                return row