对应时迭代数据框和格式化日期
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 中按共同日期加入时间序列(数据框和系列/列表问题)
将 xlsb 文件读取为 pandas 数据框并将日期列解析为日期时间格式