0

我正在尝试编写一个python脚本来转换一个.asc文件的文件夹(每年365个文件在按年份组织的不同文件夹中),它们的文件名中有yearmonthdate,而不是yearjuliandate,而朱利安日期需要是3数字(即 1 = 001)。它们的格式为:ETos19810101.asc。我希望他们成为:ETos1981001.asc

如何在 Python 中编写此代码,以便遍历每个文件并将其转换为正确的儒略日?

我正在尝试编写一个 Python 脚本来转换 .asc 文件的文件夹(每年在按年份组织的不同文件夹中的 365 个文件),这些文件的文件名中包含 yearmonthdate 以改为 yearjuliandate 并且 julian 日期需要为 3数字(即 1 = 001)。

  • 它们的格式:ETos19810101.asc
  • 我希望他们成为:ETos1981001.asc

如何在 Python 中编写此代码,以便遍历每个文件并将其转换为正确的儒略日?

到目前为止我有这个:

import os.path, os, glob

for filename in glob.glob(filepath + "/*.asc"):
    jdate = '%03d' %doy #creates 3 digit julian date
    doy = doy + 1
    filename.replace(int[-8:-4], jdate + 1)
4

3 回答 3

1

给定如下文件名(您可以使用 迭代文件系统os.walk

filename = 'ETos19810101.asc'

首先,您必须拆分文件名以获取每个重要部分:

import os
name, ext = os.path.splitext(filename)
prefix = name[0:-6] # negative prefix => string end as reference
strdate = name[-6:]

然后你可以解析日期:

from datetime import datetime
date = datetime.strptime(strdate, '%Y%m%d')

现在您可以将所有内容连接在一起(%Y%j按照您想要的方式格式化日期):

newfilename = '{prefix}{date:%Y%j}{ext}'.format(prefix=prefix, date=date, ext=ext)

最后重命名文件:

os.rename(filename, newfilename)

请注意,如果newfilename已经存在,最后一条指令将失败。要解决此问题,您必须删除该文件(如果存在):

if os.path.exists(newfilename):
    os.remove(newfilename)
os.rename(filename, newfilename)
于 2015-05-18T15:59:28.303 回答
0

要处理日期,您应该使用datetime模块。用 解析日期字符串strptime。没有返回儒略日期的函数,但很容易创建一个:

def julian_day(dt):
    jan1 = dt.replace(month=1, day=1)
    return 1 + (dt - jan1).days
于 2015-05-18T15:38:58.583 回答
0

使用'%j specifierwithdatetime.strptimeos.rename以及各种os.path命令:

from datetime import datetime
from glob import glob
import os

for filename in glob(os.path.join(filepath, 'ETos*.asc')):
    try:
        dt = datetime.strptime(os.path.basename(filename), 'ETos%Y%m%d.asc')
    except ValueError as e:
        continue # rest of file name didn't have valid date - do the needful
    os.rename(filename, os.path.join(filepath, format(dt, 'ETos%Y%j.asc')))

您可能需要对此进行一些处理并进行调整以考虑您的路径,但这是一般原则。

于 2015-05-18T15:43:43.817 回答