我可能做错了此事,或者可能有比这更好的方法,因为我还是Python的新手。对于任何明显的错误,我们会提前道歉。
我有一个带有STR列的Pandas Dataframe,其中包含日期和时间。这是STR,因为时间是“广播”格式的,这意味着一天中有29个小时。所以我们会看到类似01 / Jan / 2018 29:59:59的日期。 距离其1秒和其02 / Jan / 2018 06:00:00。
我的目标是将这些数据转换为实时数据。这意味着24到29之间的任何小时也需要日期转换。 我已经将STR从['Ti']拆分为2个新列['Dt']和['Ti'],将小时数作为['Hr']拖到新列中,并使其成为INT。 / p>
然后我将pd.to_datetime应用于['Dt']并添加了一条规则。
spec.js
var loginpage = require('./login');
var Menu = require('./menu');
describe('todo', function() {
it('activity', function() {
var question = new loginpage();
var menu = new Menu();
browser.sleep(10000);
menu.dropdown('Inquiry').click();
});
});
PAGE OBJECT FILE menu.js
var MenuPage = function() {
this.dropdown = function(dropdownName) {
var openDropdown = function() {
element(by.css('.nav'))
.element(by.css('[title=dropdownName]'))
.click();
};
return {
option: function(optionName) {
openDropdown();
return element(by.css('.dropdown.open'))
.element(by.linkText(optionName));
}
}
};
};
module.exports = MenuPage;
这很完美。
我现在需要将“小时”更改为实时,例如24 = 00、25 = 02等。
我认为最好的方法是使用DICT并对其进行映射,所以我制作了DICT,
df['Dt'] = np.where(df['Hr'] > 23, df['Dt']+pd.DateOffset(1),df['Dt']+pd.DateOffset(0) )
然后写这个
HourMap = {'24':'00','25':'01','26':'02','27':'03','28':'04','29':'05','30':'06'}
但是我收到“ ValueError”
df['Hr1'] = np.where(df['Hr'] > 23, df.replace({'Hr':HourMap}),df['Hr'])
我查看了数据框中的那些行,它们只是普通的INT。在测试中,我可以将数学应用于它们(例如df ['Test'] = df ['Hr'] + 1。
我确实将它们转换为STR并尝试了相同的规则,但是得到了相同的错误。
我只是疯了吗?
谢谢
答案 0 :(得分:3)
我认为需要改变:
df.replace({'Hr':HourMap})
到map
,如果某些值不匹配并返回NaN
,则用fillna
将其替换为原始值:
df['Hr'].map(HourMap).fillna(df['Hr'])
#alternative solution if performance is not important in large df
#df['Hr'].replace(HourMap)
因为df.replace
返回带有替换列Hr
的DataFrame的所有列
答案 1 :(得分:2)
您真的不应该在这里使用字典,甚至不需要np.where
。使用modulo operator
In [1]: import numpy as np
In [2]: np.arange(31)%24
Out[2]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6], dtype=int32)
您的数字在24岁时会“环绕”,这是课本的模数用例。这样,完整的代码就变成了:
df['Hr1'] = df['Hr'] % 24
同样,您也可以仅使用整数除法就可以将日期添加到不带np.where
的日期中
df['Dt'] = df['Dt']+pd.DateOffset(Df['Hr']//24)