我已经看过很多类似的问题,但是我无法弄清楚如何将这些原则实际应用于我自己的案例。因此,我试图找出一个可以使用的简单示例-基本上,我需要白痴指南,然后才能查看更复杂的示例
考虑一个数据框,该数据框包含名称和时间的列表以及已知的开始时间。然后,我想用完成时间更新数据帧,该完成时间是从开始时间+时间计算的
import pandas as pd
import datetime
df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
"Time":[3, 6,1, 7, 23,3,4]})
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')
我知道对于每种情况,我都可以使用来计算结束时间
finishtime = starttine + datetime.datetime.timedelta(minutes = df.iloc[0,1])
我不知道在迭代df行并使用输出更新数据帧中的第三列时如何使用它。
我尝试过
df["FinishTime"] = np.nan
for row in df.itertuples():
df.at[row,"FinishTime"] = starttine + datetime.datetime.timedelta(minutes = row.Time)
但是它给出了很多我无法解释的错误。我该怎么做?
我知道迭代数据框的建议不是-我不致力于迭代,我只需要某种方法来计算最后一列并将其添加到数据框。我的真实数据大约是20万行。
答案 0 :(得分:2)
使用pd.to_timedelta()
import datetime
starttime = datetime.datetime.strptime('2020-02-04 00:00:00', '%Y-%m-%d %H:%M:%S')
df = pd.DataFrame({"Name": ["Kate","Sarah","Isabell","Connie","Elsa","Anne","Lin"],
"Time":[3, 6,1, 7, 23,3,4]})
df.Time = pd.to_timedelta(df.Time, unit='m')
# df = df.assign(FinishTime = df.Time + starttime)
df['FinishTime'] = df.Time + starttime # as pointed out by Trenton McKinney, .assign() is only one way to create new columns
# creating with df['new_col'] has the benefit of not having to copy the full df
print(df)
输出
Name Time FinishTime
0 Kate 00:03:00 2020-02-04 00:03:00
1 Sarah 00:06:00 2020-02-04 00:06:00
2 Isabell 00:01:00 2020-02-04 00:01:00
3 Connie 00:07:00 2020-02-04 00:07:00
4 Elsa 00:23:00 2020-02-04 00:23:00
5 Anne 00:03:00 2020-02-04 00:03:00
6 Lin 00:04:00 2020-02-04 00:04:00
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.to_timedelta.html
也许不惜一切代价,但是pandas利用C实现将性能提高了几个数量级。为方便起见,已经实现了许多功能(很多)。
关于这个主题,这里有很多conversation。