我有带时间戳的数据。用户回答问题,他们也可以选择白天的时段(早上或晚上)。我想删除行记录的时间戳和日周期不匹配。因此,检查时间戳是否在6am-12pm之间,并丢弃"daytime";是"晚上",等等
df
timestamps daytime
2020-04-10 11:40 Morning
2022-04-12 19:32 Morning *(discard)*
2022-04-12 20:53 Evening
2022-04-15 22:50 Morning *(discard)*
2022-04-16 09:31 Evening*(discard)*
规则应该是:如果在06:00-12:00和"白天"之间是Evening ==>删除行/如果在18:00 - 00:00和'daytime'是Morning ==>删除行
我试过:
remove = df[ (6< df['timestamp'].dt.hour < 12 & df['period'] == 'Evening')
| (18< df['timestamp'].dt.hour < 23 & df['period'] == 'Morning')]
df.drop(remove , inplace=True)
可以使用.query()来过滤。
df["timestamps"] = pd.to_datetime(df["timestamps"])
df = df.query(
"timestamps.dt.hour.between(6, 12, inclusive='both') & daytime.eq('Morning') | "
"timestamps.dt.hour.between(18, 23, inclusive='both') & daytime.eq('Evening')"
).reset_index(drop=True)
print(df)
timestamps daytime
0 2020-04-10 11:40:00 Morning
1 2022-04-12 20:53:00 Evening
6
这样的三重操作在Python上还不可能…
我将创建一个像 这样的函数def get_part_of_day(h):
return (
"morning"
if 6 <= h <= 12
else "afternoon"
if 18 <= h <= 23
else "night"
)
和
df['datetime'].dt.hour.apply(get_pat_of_day)
将给你一个列(pandas系列),你可以很容易地比较。