【问题标题】:How to rename multiple netCDF files in a folder with dates inside these using python script?如何使用python脚本重命名文件夹中包含日期的多个netCDF文件?
【发布时间】:2021-05-26 13:13:32
【问题描述】:

例如,我有 28 个文件:-

文件 -> day01.nc 内部文件:-

| lat | lon | date      |
| --- | --- | --------  |
| 7   | 68  | 2021-02-01|
| 7   | 69  | 2021-02-01|

文件 -> day02.nc 内部文件:-

| lat | lon | date      |
| --- | --- | --------  |
| 7   | 68  | 2021-02-02|
| 7   | 69  | 2021-02-02|

文件 -> day28.nc 内部文件:-

| lat | lon | date      |
| --- | --- | --------  |
| 7   | 68  | 2021-02-28|
| 7   | 69  | 2021-02-28|

我想使用 python 脚本根据日期格式转换他们的名字,如@9​​87654329@、temp_ind20210202.nc、...、temp_ind20210328.nc

注意:-day01.nc 中,该文件内的日期格式类似于2021-02-01 等等。 我正在尝试:-

DATA_DIR = 'data'
today = datetime.datetime.now()
offset_1day = datetime.timedelta(days=1)
re_number = re.compile('day(\d{,2})\.nc')

for fname in glob.glob(DATA_DIR + "/*.nc"):
      number_string = re_number.search(fname)
if not number_string:
      continue
   number_of_days = int(number_string.group(1))
   str_timestamp = (today + (number_of_days - 1) * offset_1day).strftime("%Y%m%d")
   new_fname = f"{DATA_DIR}/temp_ind{_str_timestamp}.nc"
   print(f'{fname} -> {new_fname}')
   os.rename(fname, new_fname)

【问题讨论】:

  • 你是如何决定month的?
  • 实际上这是当前月份的数据,从日期 17-02-2021 到 18-03-2021 结束。
  • 你也可以编辑你的other question,它可以重新打开。无论如何,关于你现在的问题,所以你基本上想读取 nc 文件,从“日期”中提取第一个条目,关闭文件并根据你提取的内容重命名它?
  • 是的,这就是我想要使用 python 脚本。我无法从文件中获取日期并将其设置为文件名。请帮忙。
  • 你看过netCDF4吗?在 SO 上还有一些与在 Python 中读取 nc 文件相关的问题。对于您的具体情况,如果没有示例 .nc 文件(可能有组,日期可能采用不同的格式等),很难给出一个好的答案。

标签: python datetime netcdf weatherdata


【解决方案1】:

根据下面的问题和 cmets,您希望能够提取 NetCDF 文件中的第一个日期并使用它为该文件生成一个新文件名。以下应该可以工作,但可能需要调整,具体取决于时间的格式:

import xarray as xr
ds = xr.open_dataset("infile.nc")
"temp_ind" + ds.time[0].values.astype("str")[0:10].replace("-","") + ".nc"

【讨论】:

  • 先生,我想要自动代码,通过它我可以一次重命名多个文件。
  • 请澄清您的问题。你不知道怎么编码?简单地要求 SO 上的人为您解决问题是非常违背事物精神的。
  • 实际上我不知道如何自动化这件事。所以我需要这方面的帮助。
  • 我建议编写一个 for 循环,一次执行一个文件。你试过了吗?
  • 是的,在这种情况下,它给了我错误的日期。我想要将 .nc 文件中写入的日期作为文件名。
【解决方案2】:

我可能会在 bash 的命令行中循环执行此操作。我将 CDO 的输出通过管道传输到 awk,以防任何文件有多个日期,这将确保文件重命名为文件中的 first 日期

for file in day*.nc ; do 
   mv $file temp_ind`cdo -s showdate $file | awk '{print $1}'`.nc
done 

请注意,CDO 输出带有连字符 yyyy-mm-dd 的日期,因此您会得到一个包含连字符的文件名 - 如果您不喜欢这样,可以将带有第二个管道的那些删除到 sed .

【讨论】:

    猜你喜欢
    • 2015-08-26
    • 2019-02-28
    • 1970-01-01
    • 2021-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多