我有一个数据帧p_md。索引是DateTime。我想创建一个名为Finish的新列,如果索引在当天下午5点之前,则列值为当天晚上11点。否则,如果是在下午5点之后,则“完成”列值为NEXT日的晚上11点。
到目前为止我所拥有的:
p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year, p_md.index.month, p_md.index.day, 23, 0, 0))
p_md.loc[(p_md.index.hour > 17), "Finish"] = p_md.Finish + pd.Timedelta(days=1)
当我这样做时,我得到一个TypeError,声明datetime构造函数得到一个int64Index而不是int。所以我将行改为
p_md["Finish"] = pd.Timestamp(datetime(p_md.index.year[0], p_md.index.month[0], p_md.index.day[0], 23, 0, 0))
这会编译并运行,但它只使用数据帧的第一行值,可能是由于[0]。
表创建代码请求: 我刚刚从csv文件中读取了DateTime,但这里基本上是初始表的样子:
df = pd.DataFrame()
df['DateTime'] = pd.date_range("1/1/2017", periods=500, freq="H")
df.set_index("DateTime", inplace=True)
df["Test"] = 0
答案 0 :(得分:0)
如果我理解正确,我会创建"完成"为:
layoutBelow
然后,我将使用系列apply(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.apply.html)函数来获得所需的输出:
p_md["Finish"] = p_md.index
或者您可以创建一个单独的函数并将其分配给apply:
p_md["Finish"] = p_md["Finish"].apply(lambda dt: pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0) + pd.Timedelta(days=1)
if dt.hour > 17 else pd.Timestamp(dt.year, dt.month, dt.day, 23, 0 ,0))
这里是我得到的原始数据和输出:
2016-03-04 03:48:41 - 2016-03-04 23:00:00
2016-02-05 22:08:25 - 2016-02-06 23:00:00
2016-12-11 19:13:54 - 2016-12-12 23:00:00