在Win8上使用Python 3.3。我认为自己是脚本编写的新手。我正在尝试使用没有前导零的Excel电子表格中的日期。年份总是2位数,月份是第一位,然后是白天。我可以提取Excel列,将其单独放在文件中。以下是我可能遇到的数千行内容并将日期修改为可识别格式的一些示例:
1188(mdyy) 11188(问题日期) 12188(问题日期) 13188(mddyy) 21188(mddyy) 111188(mmddyy)我想我的问题有2部分: (1)使用Python进行修改时最容易使用的文件类型(例如XLSX,XLS,CSV,TXT等) (2)有关用Python编写以下逻辑的任何提示......也许可以使用函数?
以下是我想申请的逻辑,因为我知道没有办法真正判断日期是否只有5位数,并以“11”或“12”开头,所以我想放置ERROR而不是可以回去手动修复那些。这个想法是手工劳动越少越好。
我的旅程
下面的最终代码!!!!!!!
import csv
# Change to location of CSV file
with open('c:\\Users\\Weez\\Desktop\\csv_test.csv', newline='') as csvfile:
csvreader = csv.reader(csvfile)
for line in csvreader:
baddate = line[0]
year = int(baddate) % 100
md = int(baddate) // 100
# Check year values
if year < 10:
year = str(200)+str(year)
elif year <= 50:
year = str(20)+str(year)
else:
year = str(19)+str(year)
# Check month and day values
if md < 100:
month = md // 10
month = str(month).zfill(2)
day = md % 10
day = str(day).zfill(2)
elif md >= 1000:
pass
elif md <= 109:
month = md // 10
day = md % 10
day = str(day).zfill(2)
elif md == 110:
month = md // 100
month = str(month).zfill(2)
day = md % 100
elif md == 120:
month = md // 100
month = str(month).zfill(2)
day = md % 100
elif md <= 129:
month = str("XX")
day = str("XX")
else:
month = md // 100
month = str(month).zfill(2)
day = md % 100
dateresult = str(month)+str(day)+str(year)
print(dateresult)
# modes 'a' = append, 'w' = write, 'r' = read and other modes
with open('c:\\Users\\Weez\\Desktop\\csv_test_output.csv', 'a') as csvoutput:
csvoutput.write(dateresult)
csvoutput.write('\n')
print('\n')
print('\n')
str(input("Process complete! Press Enter to finish!"))
答案 0 :(得分:3)
对于#1,您可以使用csv
,但我对其他模块没有任何经验:(。
对于#2,您可以使用内置模块datetime
>>> from datetime import datetime
>>> date_unpadded_month = '1188'
>>> date_padded_month = '01188'
>>> date_2_digit_month = '11188'
>>> date_format = '%m%d%y'
>>> parsed = datetime.strptime(date_unpadded_month, date_format)
>>> parsed
>>> datetime.datetime(1988, 1, 1, 0, 0)
>>> parsed = datetime.strptime(date_padded_month, date_format)
>>> parsed
>>> datetime.datetime(1988, 1, 1, 0, 0)
>>> parsed = datetime.strptime(date_2_digit_month, date_format)
>>> parsed
>>> datetime.datetime(1988, 11, 1, 0, 0)
>>> parsed.month
>>> 11
答案 1 :(得分:1)
如果电子表格中的日期是有序的,您可以追溯性地返回并修复以前模棱两可的日期并取得高度成功。例如,如果你有
123087, 11188, 22288
第一个和最后一个日期不含糊不清(Dec-30-'87
&amp; Feb-22-'88
),中间日期为Jan-11-'88
或Nov-1-'88
,但可以解决你知道这三个日期是有序的。
编辑:这是实现此目的的一些代码:
from datetime import datetime
data = '123087', '1188', '11188', '22288', '11188' # some 4, 5 and 6 digit dates
fmt = '%m%d%y'
results = []
# parse possible dates from data
for date_str in data:
alt_date_str = ('0' + date_str)[-6:]
dates = (datetime.strptime(d, fmt) for d in (date_str, alt_date_str))
results.append(set(dates)) # make sure dates are unique
# iterate through results, removing anything older than the previous entries
oldest = datetime.min
for i in xrange(len(results)):
results[i] = [d for d in results[i] if d > oldest]
oldest = min(results[i])
# iterate backwards, removing anything newer than the previous entries
newest = datetime.max
for i in reversed(xrange(len(results))):
results[i] = [d for d in results[i] if d < newest]
newest = max(results[i])
# show dates, error if still ambiguous
for dates in results:
if len(dates) > 1:
print 'ERROR:', dates
else:
print dates[0]
答案 2 :(得分:1)
由于年份总是两位数,因此您可以立即消除问题的这一部分。
year = date % 100
md = date // 100
现在你可以消除2位和4位数的情况:
if md < 100:
month = md / 10
day = md % 10
elif md >= 1000:
month = md / 100
day = md % 100
现在,您需要检测潜在的问题区域并解决模糊问题。
elif md <= 109:
month = 10
day = md % 10
elif md == 110:
month = 1
day = 10
elif md <= 129:
month = None # ambiguous
day = None
else:
month = md / 100
day = md % 100
您需要进行一些额外的检查,以确保月份和日期在界限范围内。