2013-06-20 81 views
2

我有几年的文件名为day00000.nc,day00001.nc,day00002.nc,... day00364.nc。 他们代表365或366天。 我想重命名我的文件,像这样day20070101.nc,day20070102.nc,... day20071231.nc 我该怎么做? 谢谢将朱利安日转换为日期

+1

你试过了什么? – Dhara

+1

您的年份代表哪里? – Ander2

+0

他们都在同一年吗?什么是开始日期点? – Franko

回答

2

datetime在朱利安转换器构建在它的使用%j格式说明strptime功能。假设你的文件'day'两位数年份+朱利安+ 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') 
14

使用后评论​​模块从一年中的某天获取日期。由于您的文件名似乎没有年份值,因此我假设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谁是downvoting这个答案,而不是1到365这个解决方案适用于在OP。如果您的日期从1到365,并且对您而言并不明显,请在将日期转换为timedelta值之前自由减去“1”。

+0

我想你需要在最后一行更改'strptime'到'strftime'。 – Aya

+0

@Aya感谢您的支持! – Dhara

+1

我认为这增加了一天。 – seaotternerd

1

随着GNU AWK和任何类似Bourne壳

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 

测试之后删除 “回声”。