将朱利安日转换为日期

时间:2013-06-20 14:22:07

标签: python bash awk julian-date

我有几年名为day00000.nc,day00001.nc,day00002.nc,... day00364.nc的文件。 它们代表365或366天。 我想重命名我的文件,如day20070101.nc,day20070102.nc,... day20071231.nc 我怎样才能做到这一点 ? 谢谢

3 个答案:

答案 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”。