熊猫日期列中的不同格式 - 列与行的数据类型
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 块并尝试几种日期时间格式。以上是关于熊猫日期列中的不同格式 - 列与行的数据类型的主要内容,如果未能解决你的问题,请参考以下文章