根据另一列将日期添加到日期

时间:2018-03-21 14:12:31

标签: python pandas

我遇到的问题是我要合并两个数据集,它们有不同的午夜定义。因此,我希望在午夜的每次出现时为其中一个数据集添加一天,以便它们都遵循相同的日期设置。

我通过以下方式构建了我的日期和时间:

df['Date'] = pd.to_datetime(df['Date']).dt.strftime('%d/%m/%Y')
df['Hour'] = pd.to_datetime(df['Hour']).dt.strftime('%H:%M')

然后我试图修改00:00:00的任何事件,以便它在一天之后:

df.loc['Hour' == '00:00:00', 'Date'] = pd.DatetimeIndex(df.Date) + timedelta(days=1)

但是我一直在提出一个KeyError:

raise KeyError("cannot use a single bool to index into setitem")
KeyError: 'cannot use a single bool to index into setitem

非常感谢任何帮助。

目的: 输入:

Date        |  Hour
---------------------
19/06/2016  |  23:30
19/06/2016  |  23:45
19/06/2016  |  00:00
20/06/2016  |  00:15
20/06/2016  |  00:30

输出:

    Date        |  Hour
    ---------------------
    19/06/2016  |  23:30
    19/06/2016  |  23:45
    20/06/2016  |  00:00
    20/06/2016  |  00:15
    20/06/2016  |  00:30

2 个答案:

答案 0 :(得分:2)

您可以使用mask进行午夜检查并添加一天:

BSP

f['Date'] = pd.to_datetime(f['Date']) m = f['Hour'] == '00:00' f['Date'] = f['Date'].mask(m, f['Date'] + pd.Timedelta(1, unit='d')).dt.strftime('%d/%m/%Y') 的解决方案:

loc

numpy.where的解决方案:

m = f['Hour'] == '00:00'
dates = pd.to_datetime(f['Date'])
f.loc[m, 'Date'] = (dates + pd.Timedelta(1, unit='d')).dt.strftime('%d/%m/%Y')
#alternative
#f.loc[m, 'Date'] = (dates[m] + pd.Timedelta(1, unit='d')).dt.strftime('%d/%m/%Y')
m = f['Hour'] == '00:00'
dates = (pd.to_datetime(f['Date']) + pd.Timedelta(1, unit='d')).dt.strftime('%d/%m/%Y')
f['Date'] = np.where(m, dates, f['Date']) 

在代码中:

print (f)
         Date   Hour
0  19/06/2016  23:30
1  19/06/2016  23:45
2  20/06/2016  00:00
3  20/06/2016  00:15
4  20/06/2016  00:30

答案 1 :(得分:1)

我的建议不是将日期和时间分开。时间,除非你必须。

您可以通过将datettime列测试为标准化版本来测试您的时间是否为午夜:

import pandas as pd

f = pd.DataFrame({'Date': ['2018/01/01 15:00', '2018/01/02 00:00']})

f['Date'] = pd.to_datetime(f['Date'])
f.loc[f['Date'] == f['Date'].dt.normalize()] = f['Date'].apply(pd.DateOffset(1))

#                  Date
# 0 2018-01-01 15:00:00
# 1 2018-01-03 00:00:00

如果你真的必须把时间分开,你可以调整这个解决方案:

f = pd.DataFrame({'Date': ['2018/01/01', '2018/01/02'],
                  'Hour': ['15:00', '00:00']})

f['Date'] = pd.to_datetime(f['Date'])
mask = pd.to_datetime(f['Date'].astype(str)+' '+f['Hour']) == f['Date']

f.loc[mask, 'Date'] = f.loc[mask, 'Date'].apply(pd.DateOffset(1))