在我的第一个问题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]
答案 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")