Python 熊猫数据帧:i';我想';统一';价值观

Python 熊猫数据帧:i';我想';统一';价值观,python,pandas,Python,Pandas,首先,我找不到一个合适的英语方式来表达我的请求,因此它可能已经得到了答复,但我找不到我需要的东西。如果已经有了答案,请原谅我 因此,我将“小时”存储在pd.DataFrame中,如下所示: 1454 1621 以此类推(分别是14:54和16:21) 问题: 其中一些是953(09:53) 问题: 我如何“自动完成”这些,使它们是四位数长,包含零(我希望上面的是0953,另外的23是0023) 我正在考虑将数字转换为字符串,检查它们是否少于4个字符,如果不少于4个字符,则在开头添加0,但肯定有更

首先,我找不到一个合适的英语方式来表达我的请求,因此它可能已经得到了答复,但我找不到我需要的东西。如果已经有了答案,请原谅我

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

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

问题: 我如何“自动完成”这些,使它们是四位数长,包含零(我希望上面的是0953,另外的23是0023)

我正在考虑将数字转换为字符串,检查它们是否少于4个字符,如果不少于4个字符,则在开头添加0,但肯定有更类似于python的方法来实现这一点


非常感谢您的帮助,祝您度过愉快的一天

若要在开头添加0,类型必须为string。如果列名为
hours
,则以开头

df.hours = df.hours.astype(str)
现在,您可以有条件地将0添加到较短条目的开头:

short = df.hours.str.len() < 4
df.hours.loc[short] = '0' + df.hours.loc[short]
short=df.hours.str.len()<4
飞行小时数loc[短]=“0”+飞行小时数loc[短]
例如:

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
df=pd.DataFrame({'hours':[1233444233]})
df.hours=df.hours.aType(str)
short=df.hours.str.len()<4
飞行小时数loc[短]=“0”+飞行小时数loc[短]
>>>df
小时
0   0123
1   3444
2   0233

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

df.hours = df.hours.astype(str)
现在,您可以有条件地将0添加到较短条目的开头:

short = df.hours.str.len() < 4
df.hours.loc[short] = '0' + df.hours.loc[short]
short=df.hours.str.len()<4
飞行小时数loc[短]=“0”+飞行小时数loc[短]
例如:

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
df=pd.DataFrame({'hours':[1233444233]})
df.hours=df.hours.aType(str)
short=df.hours.str.len()<4
飞行小时数loc[短]=“0”+飞行小时数loc[短]
>>>df
小时
0   0123
1   3444
2   0233

您需要一个字符串列,然后才能使用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

您需要有一个字符串列,然后才能使用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

也许这只是我的问题,但我坚信所有日期操作都应该通过
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')

也许这只是我的问题,但我坚信所有日期操作都应该通过
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')

“统一化”是一个恰当的术语,但我认为你并不想改变价值观;你想统一他们的表现。(正如您所指出的,Python的整数表示不允许前导零。)这正是我想要做的。但我不知道怎么做(或者实际上我能做到,但我正在寻找一种简洁明了的方法来实现它,而不是把一个10-15行的函数放在一起,这可能不是“pythonic”)“Uniformize”是一个恰当的术语,但我认为你不想改变值;你想统一他们的表现。(正如您所指出的,Python的整数表示不允许前导零。)这正是我想要做的。但是我不知道怎么做(或者实际上我可以做,但我正在寻找一种简洁明了的方法来做,而不是把一个10-15行的函数放在一起,这可能不是“pythonic”)很好的答案——我不知道zfill!完美,这正是我想要的,因为它可以处理这两种情况(0923和0024)!非常感谢你的回答-我不知道zfill!完美,这正是我想要的,因为它可以处理这两种情况(0923和0024)!非常感谢你