当时间列满足特定条件时更改日期列

时间:2019-08-26 14:07:56

标签: python-3.x pandas datetime timedelta

在我的第一个问题here之后,给出了非常有建设性的答案,我想针对我的原始数据帧对其进行自定义。

我需要在其上进行更改的数据帧来自:nightframe=new_df.between_time('22:00','04:00'),前几行看起来像这样:

                           date      time  diffs criteria 1
datetime                                                   
2018-01-05 22:00:00  2018-01-05  22:00:00    0.0       True
2018-01-05 23:00:00  2018-01-05  23:00:00   -1.0      False
2018-01-06 00:00:00  2018-01-06  00:00:00    1.0       True
2018-01-06 01:00:00  2018-01-06  01:00:00   -2.0      False
2018-01-06 02:00:00  2018-01-06  02:00:00   -1.0       True
2018-01-06 03:00:00  2018-01-06  03:00:00    1.0       True
2018-01-06 04:00:00  2018-01-06  04:00:00    1.0      False
2018-01-06 22:00:00  2018-01-06  22:00:00   -1.0       True

如果时间是从00:00到04:00,我需要将日期分配给上一个日期。我已经尝试过根据我的条件使用这些代码,但它们不起作用:

condition = nightframe['time'].isin([0,1,2,3,4])
condition = nightframe['time'].dt.time.isin(\
                      ['00:00','01:00','02:00','03:00','04:00'])
condition = nightframe['time'](['00:00','01:00','02:00','03:00','04:00'])

如果条件成立,我想可以从nightframe['date']=np.where(condition, nightframe['date']-pd.Timedelta('1 day'), nightframe['date'])给出所需的数据框,并应给出以下视图:

                           date      time  diffs criteria 1
datetime                                                   
2018-01-05 22:00:00  2018-01-05  22:00:00    0.0       True
2018-01-05 23:00:00  2018-01-05  23:00:00   -1.0      False
2018-01-06 00:00:00  2018-01-05  00:00:00    1.0       True
2018-01-06 01:00:00  2018-01-05  01:00:00   -2.0      False
2018-01-06 02:00:00  2018-01-05  02:00:00   -1.0       True
2018-01-06 03:00:00  2018-01-05  03:00:00    1.0       True
2018-01-06 04:00:00  2018-01-05  04:00:00    1.0      False
2018-01-06 22:00:00  2018-01-06  22:00:00   -1.0       True
2018-01-06 23:00:00  2018-01-06  23:00:00    1.0       True
2018-01-07 00:00:00  2018-01-06  00:00:00    0.0      False
2018-01-07 01:00:00  2018-01-06  01:00:00    1.0       True
2018-01-07 02:00:00  2018-01-06  02:00:00    0.0      False
2018-01-07 03:00:00  2018-01-06  03:00:00   -1.0      False
2018-01-07 04:00:00  2018-01-06  04:00:00    1.0       True
2018-01-07 22:00:00  2018-01-07  22:00:00    1.0       True

注意:“ datetime”是我数据框的索引,而Nightframe列的类型是:

print(nightframe.dtypes)
date           object
time           object
diffs         float64
criteria 1     object
dtype: object

print(nightframe.index.dtype)
datetime64[ns]

3 个答案:

答案 0 :(得分:1)

谢谢您的贡献。这是对我有用的代码

我选择保留“日期”并创建“ date2”列以便进行比较。否则,在以下位置用“日期”代替“日期2”:

hours=nightframe.index.hour
condition=hours.isin([0,1,2,3,4])
nightframe['date2']=np.where(condition, \
                    nightframe['date']-pd.Timedelta('1 day'), \
                    nightframe['date'])

print(nightframe.head(20))

Output[]:
                           date      time  diffs criteria 1       date2
datetime                                                               
2018-01-05 13:00:00  2018-01-05  13:00:00    0.0        NaN  2018-01-05
2018-01-05 14:00:00  2018-01-05  14:00:00   -1.0      False  2018-01-05
2018-01-05 15:00:00  2018-01-05  15:00:00    0.0       True  2018-01-05
2018-01-05 16:00:00  2018-01-05  16:00:00   -2.0      False  2018-01-05
2018-01-05 17:00:00  2018-01-05  17:00:00    1.0       True  2018-01-05
2018-01-05 18:00:00  2018-01-05  18:00:00    1.0      False  2018-01-05
2018-01-05 19:00:00  2018-01-05  19:00:00   -1.0      False  2018-01-05
2018-01-05 20:00:00  2018-01-05  20:00:00    0.0       True  2018-01-05
2018-01-05 21:00:00  2018-01-05  21:00:00   -2.0      False  2018-01-05
2018-01-05 22:00:00  2018-01-05  22:00:00    0.0       True  2018-01-05
2018-01-05 23:00:00  2018-01-05  23:00:00   -2.0      False  2018-01-05
2018-01-06 00:00:00  2018-01-06  00:00:00   -2.0       True  2018-01-05
2018-01-06 01:00:00  2018-01-06  01:00:00    0.0       True  2018-01-05
2018-01-06 02:00:00  2018-01-06  02:00:00   -1.0      False  2018-01-05
2018-01-06 03:00:00  2018-01-06  03:00:00    0.0       True  2018-01-05
2018-01-06 04:00:00  2018-01-06  04:00:00   -1.0      False  2018-01-05
2018-01-06 05:00:00  2018-01-06  05:00:00   -2.0      False  2018-01-06
2018-01-06 06:00:00  2018-01-06  06:00:00   -1.0       True  2018-01-06
2018-01-06 07:00:00  2018-01-06  07:00:00    0.0       True  2018-01-06
2018-01-06 08:00:00  2018-01-06  08:00:00    0.0       True  2018-01-06

答案 1 :(得分:0)

您可以考虑再次使用between_time选择要删除某天的行,例如:

nightframe[nightframe.between_time('00:00','04:00').index, 'date'] -= pd.Timedelta(days=1)

,如果失败,则可能需要先用pd.to_datetime

转换列日期。
nightframe['date'] = pd.to_datetime(nightframe['date'])

答案 2 :(得分:0)

尝试这个:

df["date"] = pd.to_datetime(df["date"]) + datetime.timedelta(days=-1) * (pd.to_datetime(df["time"])<="04:00:00")