3

day00000.nc、day00001.nc、day00002.nc、...day00364.nc という名前のファイルが数年間あります。それらは 365 日または 366 日を表します。ファイルの名前を次のように変更したい day20070101.nc, day20070102.nc , ...day20071231.nc どうすればいいですか? ありがとうございました

4

3 に答える 3

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

「このソリューションは1日を追加する」という理由でこの回答に反対票を投じている人のために

OP のファイルには、1 から 365 ではなく、0 から 364 の番号が付けられています。この解決策は、OP で機能します。日付が 1 から 365 であり、それがまったく明らかでない場合は、timedelta 値に変換する前に、day 変数から自由に「1」を差し引いてください。

于 2013-06-20T14:39:11.503 に答える
3

datetimeフォーマット指定子strptimeを使用して、その機能にジュリアンコンバーターが組み込まれています。%jファイルが 2 桁の年 + ユリウス + 拡張子であると仮定します'day'(そうでない場合は、実際にある年のオフセットを追加してください)

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')
于 2013-06-20T14:37:45.650 に答える
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

テスト後に「エコー」を削除します。

于 2013-06-20T20:43:54.590 に答える