Numpy savetxt格式问题:固定宽度CSV生成时单数字日期格式异常
解决固定宽度文件中日期字段的补零与连续输出问题
你遇到的问题其实是两个小细节导致的:
- 用
%2.0f格式化单数字的日/月时,numpy会用前导空格补全宽度,而不是你需要的前导零; np.savetxt默认会用空格分隔每一列的输出,所以日、月、年三个字段会被空格拆开,无法形成连续的日期字符串。
下面给你两种直接可行的解决方法:
方法一:先合并日期列(直观易维护)
如果你的DataFrame里日、月、年是单独的列,可以先把它们合并成一个8位的日期字符串列,再输出:
# 假设日、月、年的列名是day, month, year,根据你的实际列名调整 df['full_date'] = df.apply(lambda row: f"{int(row['day']):02d}{int(row['month']):02d}{int(row['year']):04d}", axis=1) # 移除原来的日、月、年列(如果不需要保留的话) df = df.drop(['day', 'month', 'year'], axis=1) # 调整格式字符串,把原来对应三个日期列的格式符替换为%8s(匹配8位字符串) fmt = '%2s%-10s%3s%1.0f%4s%1s%4.0f%1s%1s%2.0f%2.0f%4.0f%16.0f%12.0f%5s%8s' # 输出文件 np.savetxt('df.txt', df.values, fmt=fmt)
方法二:直接修改格式符与分隔符(高效无需改DataFrame)
这种方法不需要调整DataFrame结构,只要修改格式字符串和delimiter参数:
# 把原格式中日、月的%2.0f改成%02.0f(补前导零),年的%4.0f可改为%04.0f更严谨 fmt = '%2s%-10s%3s%1.0f%4s%1s%4.0f%02.0f%02.0f%04.0f%1s%1s%2.0f%2.0f%4.0f%16.0f%12.0f%5s' # 设置delimiter为空字符串,关闭列间的空格分隔,让字段直接拼接 np.savetxt('df.txt', df.values, fmt=fmt, delimiter='')
原理说明
%02.0f是带前导零的格式化:当数字小于10时,会自动在前面补零,保证输出是两位宽度(比如7→07,3→03);delimiter=''会让np.savetxt不再在列与列之间添加空格,三个日期字段的格式化结果会直接连在一起,形成你想要的07032017。
如果你的固定宽度格式中,其他字段之间需要保留固定空格,只要确保格式符的宽度已经包含了这些空格(比如%-10s是左对齐,宽度10,自动在后面补空格)即可。
内容的提问来源于stack exchange,提问作者babz
相关产品推荐
相关产品推荐

