我有一堆像这样的文件名:
LT50300281984137PAC00_sr_band3.tif
LT50300281985137PAC00_sr_band1.tif
我想将每个文件名[9:16]中包含的julian日期更改为格里高利日期,然后将新日期重新插入文件名。我已使用此代码将julian转换为格里高利:
import datetime, glob, os
for raster in glob.glob('r'F:\Sheyenne\Atmospherically Corrected Landsat\hank_masked\julian_dates/*.tif'):
year=int(oldFilename[9:13])
#the day
day=int(oldFilename[13:16])
#convert to julian date
date=datetime.datetime(year,1,1)+datetime.timedelta(day)
print date
这将为我提供每个文件的julian日期,因此对于像LT50300281984137PAC00_sr_band3.tif
这样的文件,这将返回1984-05-17 00:00:00
,但我不想要00:00:00
我想将格里高利日期重新插入文件名,最好是19840517
。
编辑:
到目前为止,我使用了所有答案中的建议,除了执行重命名(本例中的最后一行代码)之外,我可以执行所有操作:
import datetime, glob, os
for raster in glob.glob(r'F:\Sheyenne\Atmospherically Corrected Landsat\hank_masked\julian_dates/*.tif'):
oldFilename=raster
year=int(oldFilename[9:13])
#the day
day=int(oldFilename[13:16])
#convert to julian date
date=datetime.datetime(year,1,1)+datetime.timedelta(day)
#generate newfile names
newFilename=oldFilename[:9] + date.strftime('%Y%m%d') + oldFilename[16:]
#rename the files
os.rename(oldFilename, newFilename)
这会返回错误:WindowsError: [Error 2] The system cannot find the file specified
,我认为它可能与我的os路径有关。到目前为止所有其他变量都按预期填充。
编辑:此代码适用于我
arcpy.env.workspace=r'F:\Sheyenne\Atmospherically Corrected Landsat\hank_masked\julian_dates'
hank_bands='F:\Sheyenne\Atmospherically Corrected Landsat\hank_masked\julian_dates'
hank_out='F:\Sheyenne\Atmospherically Corrected Landsat\hank_masked\greg_dates'
list1=arcpy.ListRasters("*.tif")
for raster in list1:
source_path = os.path.join(hank_bands, raster)
oldFilename=raster
year=int(oldFilename[9:13])
#the day
day=int(oldFilename[13:16])
#convert to julian date
date=datetime.datetime(year,1,1)+datetime.timedelta(day)
newFilename=oldFilename[:9] + date.strftime('%Y%m%d') + oldFilename[16:]
destination_path=os.path.join(hank_out, newFilename)
os.rename(source_path, destination_path)
答案 0 :(得分:1)
您可以使用正则表达式:
import re
import os
filename = 'LT50300281984137PAC00_sr_band3.tif'
oldDate = re.sub('(LT5030028)|(PAC00_sr_band3.tif)','',filename) # Extracts the old date
# calculate new date from old date
# newDate = '1984-05-17 00:00:00'
newDate = re.sub('(-)|( .*)','',newDate) # Removes the dashes and the time
newFilename = filename.replace(oldDate,newDate) # Replaces the old date by the new date
os.rename(filename, newFilename) # renames the file to the new file name
答案 1 :(得分:0)
获得year
和day
后,方法strftime
会提供您的结果。 1984年和137年你得到:
import datetime
date=datetime.date(year,1,1)+datetime.timedelta(day)
printf(date.strftime("%4Y%2m%2d"))
19840517
所以你现在可以做到:
newFilename = oldFilename[:9] + date.strftime("%4Y%2m%2d") + oldFilename[16:]
答案 2 :(得分:0)
要将字符串转换为日期对象,请使用datetime.strptime()
:
>>> from datetime import datetime
>>> datetime.strptime('1985137', '%Y%j')
datetime.datetime(1985, 5, 17, 0, 0)
>>> datetime.strptime('1984137', '%Y%j')
datetime.datetime(1984, 5, 16, 0, 0)
注意:输入的解释方式不同:此处1984137
为1984-05-16
(137
被解释为1月1日为第1天的一年中的某一天)datetime(year, 1, 1) + timedelta(day)
你问题中的公式暗示day
是从零开始的(两个案例都计算在2月29日)。
要将日期对象转换为字符串,请使用.strftime()
方法:
>>> datetime(1985, 5, 17, 0, 0).strftime('%Y%m%d')
'19850517'
要替换文件名中的固定位置:
>>> filename = 'LT50300281984137PAC00_sr_band3.tif'
>>> filename[9:16]
'1984137'
>>> new_name = filename[:9] + '19840516' + filename[16:]
>>> new_name
'LT503002819840516PAC00_sr_band3.tif'
如果目标可能位于其他文件系统上,则要重命名文件,请使用shutil.move()
:
>>> import shutil
>>> shutil.move(os.path.join(src_dir, filename), os.path.join(dest_dir, new_name))
如果目标文件可能已存在;致电os.remove(dest_path)
。