我有几年名为day00000.nc,day00001.nc,day00002.nc,... day00364.nc的文件。 它们代表365或366天。 我想重命名我的文件,如day20070101.nc,day20070102.nc,... day20071231.nc 我怎样才能做到这一点 ? 谢谢
答案 0 :(得分:15)
使用datetime模块获取一年中的某一天的日期。我假设你的例子中的年份是2007年,因为你的文件名似乎没有年份值。如果需要,可以随意使用变量替换代码中的硬编码2007
。
import datetime
oldFilename = 'day00364.nc'
day = int(oldFilename[3:-3])
date = datetime.datetime(2007, 1, 1) + datetime.timedelta(day) #This assumes that the year is 2007
newFilename = 'day%s.nc'%date.strftime('%Y%m%d')
print newFilename # prints day20071231.nc
对于那些因为“此解决方案增加了一天”而拒绝此答案的人
OP的文件编号为0到364,而不是1到365.此解决方案适用于OP。如果您的日期是1到365,并且对您来说一点也不明显,请在将其转换为timedelta值之前自由地从日变量中减去“1”。
答案 1 :(得分:2)
datetime
使用strptime
格式说明符在其%j
函数中使用julian转换器构建。假设你的文件是'day'
两位数+ julian + extention(如果没有,只需添加你真正拥有的年份)
file_date = filename[3:-3]
file_date = datetime.datetime.strptime(file_date, '%y%j').strftime('%Y%m%d')
new_filename = file_date.strftime('day%Y%m%d.nc')
关于如何获得年度的评论
year = datetime.datetime.fromtimestamp(os.path.getctime(filename)).year
file_date = datetime.datetime.strptime(filename[5:-3], '%j').replace(year=year)
new_filename = file_date.strftime('day%Y%m%d.nc')
答案 2 :(得分:1)
使用GNU awk和任何类似Bourne的shell
for old in *
do
new=$( gawk -v old="$old" 'BEGIN{
secs = (gensub(/[^[:digit:]]/,"","g",old) + 1) * 24 * 60 * 60
print gensub(/[[:digit:]]+/,strftime("%Y%m%d",secs),"",old)
}' )
echo mv "$old" "$new"
done
测试后删除“echo”。