python pandas dataframe 使用三元运算符选择行

问题描述 投票:0回答:2

我有必须被视为语法问题的问题。 进行一些数据清理后,数据包含日期时间字段。 日期始终存在,但有时时间会丢失。 像这样:

    3/1/2023 11:03 AM
    4/8/2022 10:21 AM
    7/19/2012
   7/12/2021
   4/16/2024 7:02 AM

所以我简单的头脑说,如果完整的冒号(:)缺少 concat 00:00。 我们就完成了。

我希望这能起作用:

dfAssetMeter_a['lastReadingDTFixed']  =  dfAssetMeter_a['LASTREADINGDATE'].astype(str)          if dfAssetMeter_a['LASTREADINGDATE'].astype(str).find(':')  > 0 else   dfAssetMeter_a['LASTREADINGDATE'].astype(str)  +  '00:00 AM'  

没起作用

这有效:

def fixDateTime(dateStr_in):
    return     dateStr_in  if dateStr_in.find(':')  > 0 else  dateStr_in +  ' 12:00 AM'


dfAssetMeter_a['lastReadingDTFixed']  =  dfAssetMeter_a['LASTREADINGDATE'].apply( fixDateTime  )

问题:

哪种“Python”方法更正确?
在我看来,方法二在星期五、假期周末之前的三点钟会更容易理解。 拜托,我不想在这里开始一场皇家之战!

有人可以提供第一种方法的正确语法吗?

python pandas dataframe conditional-operator
2个回答
1
投票

您可以将

pandas.to_datetime
format='mixed'
一起使用。

import pandas as pd

df = pd.DataFrame(
    {
        "LASTREADINGDATE": [
            "3/1/2023 11:03 AM",
            "4/8/2022 10:21 AM",
            "7/19/2012",
            "7/12/2021",
            "4/16/2024 7:02 AM",
        ]
    }
)

df["lastReadingDTFixed"] = pd.to_datetime(df["LASTREADINGDATE"], format="mixed")
     LASTREADINGDATE  lastReadingDTFixed
0  3/1/2023 11:03 AM 2023-03-01 11:03:00
1  4/8/2022 10:21 AM 2022-04-08 10:21:00
2          7/19/2012 2012-07-19 00:00:00
3          7/12/2021 2021-07-12 00:00:00
4  4/16/2024 7:02 AM 2024-04-16 07:02:00

0
投票

无论使用什么方法都可以,只要直观即可。 但是,您可以直接使用如下方式更新数据:

df.loc[~df['time'].str.contains('\:'), 'time'] += ' 12:00AM'
© www.soinside.com 2019 - 2024. All rights reserved.