熊猫日期列中的不同格式 - 列与行的数据类型

Posted

技术标签:

【中文标题】熊猫日期列中的不同格式 - 列与行的数据类型【英文标题】:Different format in pandas date column - data type of column vs. row 【发布时间】:2019-05-09 08:21:48 【问题描述】:

我有一个 pd DataFrame 列,其中包含不同格式的日期值。例如“YYYY-MM-DD hh:mm:ss”和“DD.MM.YYYY”甚至是“DD.MM”。我想将它们全部转换为一种格式(例如,'YYYY-MM-DD')并尝试过(在很多事情中)

df[~df.date.str.contains('(\d4)-(\d2)-(\d2) (\d2):(\d2):(\d2)')] 

查找日期未写为“YYYY-MM-DD hh:mm:ss”的行。但是,这不起作用。

因此我检查了列的类型

df['date'].dtype   #prints dtype('O')

然后我检查了

for index, row in df.iterrows():
    print(type(row['date']))

并收到混合打印,例如“datetime.datetime”类和“str”类

我很困惑。当列是“对象”数据类型时,为什么我不总是得到“str”?有没有人知道如何使正则表达式工作?

【问题讨论】:

我想将它们全部转换为一种格式 - 哪一种? 一种方法是将它们转换为日期时间对象,你可以决定我猜的格式...... @PedroLobito 最好是 YYYY-MM-DD。我已经编辑了我的帖子 那么,您想将哪一年分配给 DD.MM 日期?这是它无法自动解析的唯一格式,因此如果您只是修改这些字符串并添加年份,则调用 pd.to_datetime 将转换所有内容 如果您确定格式始终为 DD.MM,例如,您可以使用df.loc[df.date.str.len() == 5, 'date'] += '.2017'。如果它可能是 D.M,那么可能会成为 < 5 【参考方案1】:
def findIndex(x):
    try:
        pd.to_datetime(x).strftime('%m/%d/%Y')
        return
    except:
        return True


df.date.apply(lambda x: findIndex(x))

现在您可以获取所有具有奇怪格式的索引。希望这会有所帮助。

【讨论】:

我之前实际上尝试过,但只收到错误“ValueError: ('Unknown string format:', '01.01.')”,因为如帖子中所述,有些年份缺少年份。这就是为什么我想将数据框过滤到具有奇怪格式的数据框并“手动”添加缺失的年份 改用df.date.apply(lambda x: pd.to_datetime(x, errors='coerce').strftime('%m/%d/%Y')[0]) 你可以用你的函数代替 lambda func。使用 try/catch 块并尝试几种日期时间格式。

以上是关于熊猫日期列中的不同格式 - 列与行的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含文本的熊猫数据框中的列中提取年份(或日期时间)

其他技术----mongoDB基础

Pentaho - 数据格式

从熊猫的日期时间列中提取日期和小时[重复]

将熊猫数据框中的多列更改为日期时间

如何将一列中的两列合并为日期与熊猫?