熊猫dataFrame:我想``统一''值

时间:2018-10-05 12:00:51

标签: python pandas

首先,我找不到正确的英语方式来提交我的请求,因此可能之前已经有人回答过,但我找不到我需要的东西。如果对此已经有了答案,请原谅我。

因此我将“小时”存储在pd.DataFrame中,如下所示: 1454 1621 等等(分别是14:54和16:21)

问题: 其中一些是953(代表09:53)。

问题: 我怎么能“自动完成”这些,使它们长为四位数,包含零(我希望上面的数字为0953,另外23为0023)。

我正在考虑将数字转换为字符串,检查它们是否少于4个字符,如果没有,则在开头添加一个0,但是肯定有一种更Python的方式可以做到这一点?

非常感谢您的帮助,祝您有愉快的一天!

3 个答案:

答案 0 :(得分:4)

您需要具有一个字符串列,然后才能使用zfill:

df = pd.DataFrame([1453, 923, 24, 1250], columns=['time'])
df['time'].astype(str).str.zfill(4)


#0    1453
#1    0923
#2    0024
#3    1250
#Name: time, dtype: object

答案 1 :(得分:2)

要在开头添加0,类型必须为字符串。如果列名称为hours,则以

开头
df.hours = df.hours.astype(str)

现在,您可以有条件地在较短的条目的开头添加一个0:

short = df.hours.str.len() < 4
df.hours.loc[short] = '0' + df.hours.loc[short]

例如:

df = pd.DataFrame({'hours': [123, 3444, 233]})
df.hours = df.hours.astype(str)
short = df.hours.str.len() < 4
df.hours.loc[short] = '0' + df.hours.loc[short]
>>> df
    hours
0   0123
1   3444
2   0233

答案 2 :(得分:2)

也许这只是我,但我坚信所有日期操作都应通过datetime而非字符串完成,因此我建议采取以下措施:

df['time'] = pd.to_datetime(df['time'].astype(str).str.zfill(4).apply(lambda x: x[:2] + ':' + x[2:]))
df['time_str'] = df['time'].dt.strftime('%I-%M')