我可能做错了,也可能有比这更好的方法,因为我对Python还不熟悉。为任何明显的错误预先道歉。
我有一个的STR列,包含日期和时间。这是STR,因为时代是“广播”格式化,这意味着有29个小时在一天。因此,我们将看到类似01/2018年1月29日:59:59的日期。时间是1秒和02/1/2018:06:00。
我在这里的目标是将这些数据转换成实时的。这意味着24到29岁之间的任何一个小时都需要换班。我已经把STR分成两个新的列'Dt‘和'Ti',从'Ti',把这个小时作为'Hr’的一个新列,并使它成为一个INT。
然后,我对'Dt‘应用了一个pd.to_datetime,并添加了一个规则。
df['Dt'] = np.where(df['Hr'] > 23, df['Dt']+pd.DateOffset(1),df['Dt']+pd.DateOffset(0) )这是完美的。
我现在需要改变的时间是实时的,例如,24 = 00,25 = 02等。
我认为最好的方法是用一个字典来映射它,所以我做了一个小插曲,
HourMap = {'24':'00','25':'01','26':'02','27':'03','28':'04','29':'05','30':'06'} 然后写了这个
df['Hr1'] = np.where(df['Hr'] > 23, df.replace({'Hr':HourMap}),df['Hr'])但我得到了一个"ValueError“
ValueError: operands could not be broadcast together with shapes (273,) (273,29) (273,)我看过数据帧中的那些行,它们只是普通的in。考试时,我可以把数学应用到他们身上。df‘’Test‘=df’‘Hr’+ 1。
我确实将它们转换为STR,并尝试了相同的规则,但是得到了相同的错误。
我只是疯了吗?
谢谢,
发布于 2018-10-29 12:16:01
你真的不应该在这里使用字典,你甚至不需要np.where。使用模算子
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)发布于 2018-10-29 11:33:42
我认为需要改变:
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的所有列
https://stackoverflow.com/questions/53044621
复制相似问题