Python - 在CSV文件中将前导零添加到日期中的数字

时间:2014-01-06 04:38:05

标签: python date data-conversion

在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而不是可以回去手动修复那些。这个想法是手工劳动越少越好。

  • 最后一年总是2位数字,因此需要立即解析剩余的数字
    • IF年数字从“00”到“30”然后附上一个前导“20”以形成一个4位数的年份
    • 否则附上一个领先的“19”以形成一个4位数的年份
  • 计算取走年份数字后剩余的位数
    • 如果剩余总数= 2那么解析出第一个和第二个数字,并将前导零添加到两个数字
    • 剩下的ElseIF总数= 3那么
      • 如果前两个数字是“11”或“12”,则打印最终结果为“ERROR”
      • ElseIF前两个数字是“10”然后解析为AND将前导零添加到第三个数字
      • 否则解析出第一个数字并添加前导零,然后按原样解析剩余的2个数字
    • 剩余的总数= 4,那么什么都不做
  • 确保以最终结果的新格式重新组合日期

非常感谢任何帮助,并开始自行开始!

我的旅程

最初我需要帮助将我的逻辑引入Python,然后与以下内容作斗争但最终成功的时间,研究和有用的人在stackoverflow:读/写/附加CSV文件,填写前导零,填写年份的领先数字,语法,不正确的数据类型等...感谢所有帮助!!!

下面的最终代码!!!!!!!

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!"))

3 个答案:

答案 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-'88Nov-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

您需要进行一些额外的检查,以确保月份和日期在界限范围内。