pandas 查找csv文件中日期列数并将日期格式更新为MM-DD-YYYY的Python脚本

rkkpypqq  于 2023-02-28  发布在  Python
关注(0)|答案(2)|浏览(202)

我得到一个文件每天约15列。有些日子有2个日期列和一些日子一个日期列。也有些日子的日期格式是YYYY-MM-DD和一些其DD-MM-YYYY。任务是转换2或1日期列MM-DD-YYYY。示例数据在csv文件中的几列:
| 执行日期|提取日期|申请人_姓名|计数|
| - ------|- ------|- ------|- ------|
| 2023年1月15日|2023年1月15日|约翰·史密斯|七|
有时我们无法获得上面的第二列-extract_date:
| 执行日期|申请人_姓名|计数|
| - ------|- ------|- ------|
| 二○二三年一月十七日|安德鲁·米尔|三个|
任务是查找文件中的所有日期列,并将日期格式更改为MM-DD-YYYY。
因此,上述2个文件的示例输出为:
| 执行日期|提取日期|申请人_姓名|计数|
| - ------|- ------|- ------|- ------|
| 二○二三年一月十五日|二○二三年一月十五日|约翰·史密斯|七|
| 执行日期|申请人_姓名|计数|
| - ------|- ------|- ------|
| 二○二三年一月十七日|安德鲁·米尔|三个|
我正在使用Pandas,不知道如何处理某些日子缺少的第二列和日期值格式的更改。
我可以硬编码这两个列名并通过以下方式更改格式:

df['Execution_Date'] = pd.to_datetime(df['Execution_Date'], format='%d-%m-%Y').dt.strftime('%m-%d-%Y')
df['Extract_Date'] = pd.to_datetime(df['Extract_Date'], format='%d-%m-%Y').dt.strftime('%m-%d-%Y')

这仅在文件有2列且值为DD-MM-YYYY格式时有效。
寻找关于如何动态查找日期列数和日期值格式的指导,以便我可以在上面的2行代码中使用它。如果没有,那么任何其他的解决方案也可以为我工作。我可以使用powershell,如果它不能在python中完成。但我猜将有更多的途径在python中做这件事比我们将在powershell。

bzzcjhmw

bzzcjhmw1#

下面的代码将一个CSV文件加载到一个 Dataframe 中,检查每个值(str),看看它是否与某个日期格式匹配,如果匹配,则将日期重新排列为您要查找的格式。

import pandas as pd
import re

df = pd.read_csv("today.csv")
# compiling the patterns ahead of time saves a lot of processing power later
d_m_y = re.compile(r"(\d\d)-(\d\d)-(\d\d\d\d)")
d_m_y_replace = r"\2-\1-\3"
y_m_d = re.compile(r"(\d\d\d\d)-(\d\d)-(\d\d)")
y_m_d_replace = r"\2-\3-\1"

def change_dt(value):
    if isinstance(value, str):
        if d_m_y.fullmatch(value):
            return d_m_y.sub(d_m_y_replace, value)
        elif y_m_d.fullmatch(value):
            return y_m_d.sub(y_m_d_replace, value)
    return value

new_df = df.applymap(change_dt)

但是,如果有其他列包含您不想更改的日期,而您只想指定要更改的列,请使用以下内容而不是上面的最后一行:

cols = ["Execution_date", "Extract_date"]

for col in cols:
    if col in df.columns:
        df[col] = df[col].apply(change_dt)

如果愿意,可以将列转换为日期时间。

rpppsulh

rpppsulh2#

您可以使用函数检查所有包含"date"的列名,并使用. fillna尝试其他格式(添加所有可能的格式)。

import pandas as pd

def convert_to_datetime(df: pd.DataFrame, column_name: str) -> pd.DataFrame:
    for column in df.columns[df.columns.str.contains(column_name, case=False)]:
        df[column] = (
            pd.to_datetime(df[column], format="%d-%m-%Y", errors="coerce")
            .fillna(pd.to_datetime(df[column], format="%Y-%m-%d", errors="coerce"))
        ).dt.strftime("%m-%d-%Y")

    return df

data1 = {'Execution_date': '2023-01-15', 'Extract_date': '2023-01-15', 'Requestor_Name': "John Smith", 'Count': 7}
df1 = pd.DataFrame(data=[data1])

data2 = {'Execution_date': '17-01-2023', 'Requestor_Name': 'Andrew Mill', 'Count': 3}
df2 = pd.DataFrame(data=[data2])

final1 = convert_to_datetime(df=df1, column_name="date")
print(final1)
final2 = convert_to_datetime(df=df2, column_name="date")
print(final2)

输出:

Execution_date Extract_date Requestor_Name  Count
0     01-15-2023   01-15-2023     John Smith      7

  Execution_date Requestor_Name  Count
0     01-17-2023    Andrew Mill      3

相关问题