对应时迭代数据框和格式化日期

Posted

技术标签:

【中文标题】对应时迭代数据框和格式化日期【英文标题】:Iterate Dataframe and format dates when correspond 【发布时间】:2021-08-24 17:31:40 【问题描述】:

我有这个 .csv 文件

我想使用 Glue 将它带到 AWS 中的 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 表将只有 varchar 字段。现在这是真实的事情: 我需要迭代从 csv 文件中获得的数据框,并尝试识别类似日期格式的字符串并用特定格式解析它们,这样我就可以再次将它们解析为字符串并最终插入表中。 这是我尝试过的最后一件事,它应该迭代每一行并分析它的数据类型,如果它是对象(其中数据框处理字符串),它将尝试用声明的格式解析值,如果不是,那么就通过并继续:

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 结构在 Redshift 中使用 varchars 创建了许多不同的表。所以它必须能够识别写成字符串的类日期格式。

【问题讨论】:

【参考方案1】:

尝试更改这些行:

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)

【讨论】:

抱歉回复晚了。您的答案可能是我需要的,因为现在我收到有关不兼容镶木地板架构的错误。现在我必须调整一些事情来解决它。也就是说,我会将您的答案标记为“答案”。谢谢。

以上是关于对应时迭代数据框和格式化日期的主要内容,如果未能解决你的问题,请参考以下文章

将前台日期格式转成与数据库日期格式相对应,后台java转数据库日期格式

在 Python 中按共同日期加入时间序列(数据框和系列/列表问题)

python数字怎么转变时间?

将 xlsb 文件读取为 pandas 数据框并将日期列解析为日期时间格式

excel的单元格为空 日期型 插入到SQL数据库 为啥会出现默认时间1900-1-2

两个日期相差天数