对应时迭代 Dataframe 和格式化日期

Iterate Dataframe and format dates when correspond

我有这个 .csv 文件

我想使用 Glue 将它带到 AWS 中的 Redshift 数据库。

我有这个查询来将列数据类型从 redshift 映射到数据框架数据类型:

query = "SELECT column_name, case when data_type in ('bigint', 'integer') then 'int' when data_type in ('numeric') then 'float64' when data_type like 'double%' then 'float' else 'str' end data_type  FROM information_schema.columns where table_schema='reportes_bi' and table_name='" + tableName.lower() + "';"

因此,当我迭代该列时,它会打印:

{
    "last_name": "str",
    "first_name": "str",
    "identifier": "str",
    "login": "str",
    "fechaprueba": "str"
}

基本上,所有值都被视为字符串,因此 redshift table 将只有 varchar 字段。现在这是真实的东西: 我需要迭代从 csv 文件中获取的数据框,并尝试识别类似日期格式的字符串并使用特定格式解析它们,然后我可以再次将它们解析为字符串并最终插入 table. 这是我尝试过的最后一件事,它应该迭代每一行并分析它的数据类型,如果它是对象(在其中数据框处理字符串)它将尝试使用声明的格式解析值,如果不是,那么就通过并继续:

formato = date_format # %Y/%m/%d
    for x in df.columns:
        if df[x].dtypes == object:
            try:
                enm = df.apply(lambda row: row[x].strptime(formato), axis=1)
                print(enm)
                df[x] = str(enm)
            except:
                pass

我尝试对迭代使用 .iterrows(), .itertuples(), .iteritems() and .items(),对条件使用 df[x].dtypes == str(df[x]), df[x].dtypes == df[x].str.contains('').any(),但似乎没有任何效果。 我已经阅读了有关迭代数据帧的文档,但在我的绝望中,我一直在尝试很多无意义的混合选项。

为什么不只声明我要迭代和解析的日期列? 因为根据接收到的 csv 结构,此服务使用 varchars 在 Redshift 中创建了许多不同的 table。所以它必须能够识别写成字符串的类日期格式。

尝试更改这些行:

try:
    enm = df.apply(lambda row: row[x].strptime(formato), axis=1)
    print(enm)
    df[x] = str(enm)

致这些:

try:
    df[x] = df[x].apply(lambda x: x.strptime(formato), axis=1)