00 前言
此前对于这方面知识不是很了解,现在也是。
所以现在稍微总结一下,就从文件名的获取 ==> 文件名的日期截取 ==> 日期(str)的类型转换(int)
==> 日期的整理(乱的) ==> 格式化输出.
这里我假定大家获取到了某一文件的路径如下:
D:\IDL_program\experiment_data\chapter_1\
MODIS_2018_mod04_3k\MYD04_3K.A2018121.0545.061.2018121172155.hdf
01 第一步,使用file_basename()函数路径中的获取文件名
path = 'D:\IDL_program\experiment_data\chapter_1\MODIS_2018_mod04_3k\MYD04_3K.A2018121.0545.061.2018121172155.hdf' file_name = file_basename(path, '.hdf')
FILE_BASENAME()函数
语法:Result = FILE_BASENAME(Path [, RemoveSuffix] [, /FOLD_CASE])
参数说明:
path:(必选)输入路径名<字符串格式>
RemoveSuffix:(可选)输入需要删除的后缀名<字符串格式>
FOLD_CASE:(可选)关于删除后缀名是否大小写的问题,这里99%基本用不到,故不作解释.
02 第二步,使用strmid()函数获取文件名的日期
在获取之前,需要说明文件名日期的相关信息。获取得到的文件名file_name = MYD04_3K.A2018121.0545.061.2018121172155,其中,从左往右第10(从0开始)个字符到第16个字符是我们需要的字符串即2018121,它表示2018年的第121天。
1. year = strmid(file_name, 10, 4) 2. days = strmid(file_name, 14, 3)
STRMID()函数
语法:Result = STRMID(Expression, First_Character [, Length] , /REVERSE_OFFSET )
参数说明:
Expression:(必选)输入需要截取的字符串
FIrst_Character:(必选)输入需要截取部分的第一个字符的索引(从0开始)
Length:(可选)输入第需要截取部分的
REVERSE_OFFSET:指定First_Character应从字符串的结尾而不是开头开始计数(例如倒数第一个字符的索引为0,倒数第二个字符的索引为1如此)。然后,长度从该位置向右移动到字符串的末端。这将可以从末尾简单地提取字符串。
03 第三步,将获取的日期进行类型转换
很明显,string类型的变量year和days是无法进行计算的,所以需要进行字符串转整型。
year = fix(year) days = fix(year)
FIX()函数
无需过多说明,就是将浮点数或者字符串型的整数转化为整数.或许和想象的不一样,它并不是使用int()函数而是我们没有见过的fix()函数进行类型转换.
04 第四步,将日期进行整理
日是有一定的难度.或许你会想着自己计算然后编写一个函数用于年月日的获取,这虽然可行但是暂时没有必要。IDL专门提供了两个函数用于儒略日与正常年月日之间的转换。
一个是JULDAY()函数,传入月、日、年返回该天距离1582年10月4日的总天数;
另一个是CALDAT()函数,传入距离1582年10月4日的总天数,返回该天的月、日、年。
那么我们这里的2018121的总体思路是,将2017年12月31日传入JULDAY函数返回儒略日,然后将该儒略日加上121天,最后将新的儒略日传给CALDAT函数得到返回的月、日、年。
julday_date = julday(12, 31, year - 1) julday_date += days caldat, julday_date, month, day, year
05 第五步,进行格式化输出
直接用print输出即可.
; 方法1 print, format='(i04, "-", i02, "-", i02)', year, month, day ; 方法2 print, format='(3(i0, :, "-"))', year, month, day
输出结果展示: