需要帮助在csv文件中创建新列的日期

64jmpszr  于 2023-04-18  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一个csv文件,它有多列,其中一列名为“dates”。在“dates”中包含一些日期,有些行的日期比其他行多。下面是一个文件中日期的示例:

dates
31-Mar-24
Nov 21, 2024, Apr 14, 2025, May 18, 2025
21-Oct-23
26-Sep-24
22-Nov-23
24-Sep-24
13-Nov-23
10-Apr-24
23-Sep-23
Apr 16, 2025, Jun 04, 2025

我希望将日期分隔到各自的列中。如果您使用我前面的示例,其中一行的数据为“Nov 21,2024,Apr 14,2025,May 18,2025”。我希望它在输出中看起来像这样:

date                date2:                date3:
nov 1, 2024             Apr 14, 2025    you get it right

以此类推,你就明白了,我希望所有包含多个日期的列都被放到另一列中,但必须在同一行中。
以下是我尝试过的代码,但它不起作用:

import csv

with open('input.csv', 'r') as csv_input_file, open('output.csv', 'w', newline='') as csv_output_file:
    reader = csv.reader(csv_input_file)
    writer = csv.writer(csv_output_file)

    header = next(reader)
    new_columns = []
    for column in header:
        if column == 'dates':
            new_columns.extend(['date' + str(i+1) for i in range(10)])  # maximum of 10 date columns
        else:
            new_columns.append(column)
    writer.writerow(new_columns)

    for row in reader:
        dates_str = row[header.index('dates')]
        dates_list = dates_str.split(',')
        dates_list = [date.strip() for date in dates_list]

        new_row = []
        for column in row:
            if column == dates_str:
                new_row.extend(dates_list)
                new_row.extend([''] * (len(new_columns) - len(new_row)))
            else:
                new_row.append(column)

        writer.writerow(new_row)

这是我目前的代码,但问题是,它是分裂的日期在每一个逗号,使年被分裂从月和天到所有新的列。Cant似乎找到一个解决方案,并希望有人在这里可以帮助。

jhdbpxl9

jhdbpxl91#

使用正则表达式分割日期,这将防止在日期字符串中使用逗号分割。

import csv
import re

with open('input.csv', 'r') as csv_input_file, open('output.csv', 'w', newline='') as csv_output_file:
    reader = csv.reader(csv_input_file)
    writer = csv.writer(csv_output_file)

    header = next(reader)
    new_columns = []
    for column in header:
        if column == 'dates':
            new_columns.extend(['date' + str(i+1) for i in range(10)])  # maximum of 10 date columns
        else:
            new_columns.append(column)
    writer.writerow(new_columns)

    date_pattern = re.compile(r'\d{1,2}-\w{3}-\d{2,4}|\w{3}\s\d{1,2},\s\d{4}')

    for row in reader:
        dates_str = row[header.index('dates')]
        dates_list = date_pattern.findall(dates_str)
        dates_list = [date.strip() for date in dates_list]

        new_row = []
        for idx, column in enumerate(row):
            if header[idx] == 'dates':
                new_row.extend(dates_list)
                new_row.extend([''] * (len(new_columns) - len(new_row)))
            else:
                new_row.append(column)

        writer.writerow(new_row)
xdnvmnnf

xdnvmnnf2#

使用pandas,您可以尝试以下操作:

with open("input.csv", "r") as f:
    data = f.read()
    
df = (pd.Series(data.split("\n"))
          .loc[1:].str.split(r",\s*(?=[A-Z]+)", expand=True)
          .rename(lambda x: x+1, axis=1)
          .add_prefix("date")
     )

#df.to_csv("output.csv", index=False) #uncomment this line to make a csv

输出:

print(df)

           date1         date2         date3
1      31-Mar-24          None          None
2   Nov 21, 2024  Apr 14, 2025  May 18, 2025
3      21-Oct-23          None          None
4      26-Sep-24          None          None
5      22-Nov-23          None          None
6      24-Sep-24          None          None
7      13-Nov-23          None          None
8      10-Apr-24          None          None
9      23-Sep-23          None          None
10  Apr 16, 2025  Jun 04, 2025          None

相关问题