将系列添加到pandas数据帧

时间:2017-08-20 16:40:01

标签: python pandas dataframe indexing

我有一个数据帧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

1 个答案:

答案 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