【问题标题】:Using pd.apply() to turn each element in a column to a list, grab the 1st element, and turn it into datetime使用 pd.apply() 将列中的每个元素转换为列表,获取第一个元素,并将其转换为日期时间
【发布时间】:2021-07-27 12:34:48
【问题描述】:

我有一个只有一行的数据框(将来会更多,但我只是以此为例)。我正在尝试获取“SETTLEMENT_DATE”列。

print(previous["SETTLEMENT_DATE"])

0 2021-06-22 00:00:00.0

Name: SETTLEMENT_DATE, dtype: object.

为了得到日期,我做了list(previous["SETTLEMENT_DATE"])[0],结果如下: '2021-06-22 00:00:00.0'。现在我将其转换为日期格式:

def create_datetime_object(pd_object):

date_time_str = list(pd_object)[0]
return datetime.strptime(date_time_str, "%Y-%m-%d %H:%M:%S.%f")

此代码:create_datetime_object(previous["SETTLEMENT_DATE"])

产量:datetime.datetime(2021, 6, 22, 0, 0)

以后我会有多行数据,所以想用pd.apply()把这个函数应用到整列。但是当我这样做时,我得到:

previous["SETTLEMENT_DATE"] = previous["SETTLEMENT_DATE"].apply(create_datetime_object)

ValueError: time data '2' does not match format '%Y-%m-%d %H:%M:%S.%f

有谁知道我为什么会收到此错误以及如何解决?

【问题讨论】:

    标签: python pandas datetime strptime


    【解决方案1】:

    这应该可行:

    previous["SETTLEMENT_DATE"] = previous.apply(lambda r : create_datetime_object(r.SETTLEMENT_DATE) , axis=1)
    

    【讨论】:

    • 我认为因为我的数据框只包含一行,previous["SETTLEMENT_DATE"] 实际上是一个系列?当我运行它时,我得到: TypeError: () got an unexpected keyword argument 'axis'
    • 确实,如果它是一个系列,它不会工作。但是,当您有一个包含许多行的数据框时,此代码将起作用。
    • 好的,很好。看起来我只需要创建一个 if else 语句来说明 df 可能只包含一行的情况。在某些情况下,我有很多行,而 df 中只有一行,具体取决于日期。感谢您的帮助。
    • 更新:此代码实际上不起作用。 Df["column"].apply(lambda, axis = 1) 会导致错误,因为 Df["column"] 是一个系列。但是 Df.apply(lambda x:function(x['col'],axis=1) 会起作用。
    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多