【发布时间】:2018-08-02 09:54:08
【问题描述】:
假设我有这样的数据
id Date Time_Start Time_End start stop split
0 011 2017-08-01 20:20 21:40 2017-08-01 20:20:00 2017-08-01 21:40:00 False
1 012 2017-08-01 17:15 19:12 2017-08-01 17:15:00 2017-08-01 19:12:00 True
2 013 2017-08-01 15:46 16:20 2017-08-01 15:46:00 2017-08-01 16:20:00 False
截止时间为每天 18:00。因此,例如,“012”应该分成两行 并且第一行的停止列应更新为 2017-08-01 17:59:00,而第二行的开始将是 2017-08-01 18:00:00,其余保持不变
id Date Time_Start Time_End start stop split birth_date
0 011 2017-08-01 20:20 21:40 2017-08-01 20:20:00 2017-08-01 21:40:00 False 2017-08-01
1 012 2017-08-01 17:15 19:12 2017-08-01 17:15:00 2017-08-01 17:59:00 True 2017-08-01
1 012 2017-08-01 17:15 19:12 2017-08-01 18:00:00 2017-08-01 19:12:00 True 2017-08-02
2 013 2017-08-01 15:46 16:20 2017-08-01 15:46:00 2017-08-01 16:20:00 False 2017-08-01
请注意,如果在 18:00 之前的停止时间“birth_date”将与“date”同一天,但如果在剪切之后,“birth_date”,我还想在末尾创建一个名为“birth_date”的新列“将是第二天。
以下是迄今为止我一直在使用的代码,我被困在我要问的地方。因此,我们将不胜感激。
import pandas as pd
from datetime import datetime, time
def make_date_time(df):
df["start"] = pd.to_datetime(df["Date"].apply(str) + " " + df["Time_Start"])
df["stop"] = pd.to_datetime(df["Date"].apply(str) + " " + df["Time_End"])
def check_date_time(df):
if df["start"] > df["stop"]:
df["stop"] += pd.Timedelta(days=1)
return df["stop"]
df["stop"] = df.apply(check_date_time, axis=1)
return df
def in_cut(df):
reference = df["start"].replace(hour=18, minute=0, second=0)
if df["start"] <= df["stop"]:
return df["start"] <= reference < df["stop"]
else:
return df["start"] <= reference or reference < df["stop"]
data = {"id":["011","012","013"], "Date": ["2017-08-01", "2017-08-01", "2017-08-01"], "Time_Start":["20:20", "17:15", "15:46"], "Time_End":["21:40", "19:12", "16:20"]}
df = pd.DataFrame.from_dict(data)
df = make_date_time(df)
df["split"] = False
df["stop"] = df.apply(check_date_time, axis=1)
df["split"] = df.apply(in_cut, axis=1)
df
【问题讨论】:
标签: python pandas datetime dataframe