我在 Dataframe 中有日期时间列。
我想在同一数据框中创建一个虚拟列,以便 对于 A 值的第一行等于日期时间列的第一行 + 15 分钟 A 行的第 2 行等于 A 的第 1 行的值 A 行的第 3 行等于 A 的第 3 行的值
比 4 行的值再次等于日期时间列的第 4 行 +15 分钟 如此等等 我写了这个循环,f是主数据帧
m15 = []
i=0,
while i < len(f):
m15[i] = f['Datetime'][i]+ dt.timedelta(minutes=15),
m15[i+1] = m15[i]
m15[i+2] = m15[i]
i=i+3
我收到错误'<'在'tuple'和'int'实例之间不受支持
如何解决问题
期望的输出
Datetime Dummy
2020-16-12 09:15:00 2020-16-12 09:30:00
2020-16-12 09:20:00 2020-16-12 09:30:00
2020-16-12 09:25:00 2020-16-12 09:30:00
2020-16-12 09:30:00 2020-16-12 09:45:00
2020-16-12 09:35:00 2020-16-12 09:45:00
2020-16-12 09:40:00 2020-16-12 09:45:00
最佳答案
首先不要使用循环,因为这里有可能的矢量化替代方案。
您可以向列中添加 15 分钟
,然后将第二个和第三个值替换为 NaT
并使用 ffill
向前填充缺失值。
这里使用组的辅助数组np.arange(len(df))
,但如果可以使用默认RangeIndex
,则可以通过df.index<更改它
.
#if necessary
#df['Datetime'] = pd.to_datetime(df['Datetime'], format='%Y-%d-%m %H:%M:%S')
df['New'] = (df['Datetime'].add(pd.Timedelta(minutes=15))
.mask(np.arange(len(df)) % 3 != 0)
.ffill())
print (df)
Datetime Dummy New
0 2020-12-16 09:15:00 2020-16-12 09:30:00 2020-12-16 09:30:00
1 2020-12-16 09:20:00 2020-16-12 09:30:00 2020-12-16 09:30:00
2 2020-12-16 09:25:00 2020-16-12 09:30:00 2020-12-16 09:30:00
3 2020-12-16 09:30:00 2020-16-12 09:45:00 2020-12-16 09:45:00
4 2020-12-16 09:35:00 2020-16-12 09:45:00 2020-12-16 09:45:00
5 2020-12-16 09:40:00 2020-16-12 09:45:00 2020-12-16 09:45:00
另一个想法:
df['New'] = (df['Datetime'].add(pd.Timedelta(minutes=15))
.groupby(np.arange(len(df)) // 3)
.transform('first'))
关于python - 根据数据框中的列创建虚拟列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65318428/