pandas apply(str)和astype(str)对datetime64[ns] panda列的不同行为

kd3sttzy  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(191)

我正在panda中处理日期时间信息,并希望将一堆datetime64[ns]列转换为str,我注意到两种方法的行为不同,而我预期这两种方法会产生相同的结果。
这是一个MCVE

import pandas as pd

# Create a dataframe with dates according to ISO8601
df = pd.DataFrame(
    {
        "dt_column": [
            "2023-01-01",
            "2023-01-02",
            "2023-01-02",
        ]
    }
)

# Convert the dates to datetime columns
# (I expect the time portion to be 00:00:00)
df["dt_column"] = pd.to_datetime(df["dt_column"])

df["str_from_astype"] = df["dt_column"].astype(str)
df["str_from_apply"] = df["dt_column"].apply(str)

print(df)
print("")
print(f"Datatypes of the dataframe \n{df.dtypes}")
    • 产出**
dt_column str_from_astype       str_from_apply
0 2023-01-01      2023-01-01  2023-01-01 00:00:00
1 2023-01-02      2023-01-02  2023-01-02 00:00:00
2 2023-01-02      2023-01-02  2023-01-02 00:00:00

Datatypes of the dataframe 
dt_column          datetime64[ns]
str_from_astype            object
str_from_apply             object
dtype: object

如果使用.astype(str),时间信息将丢失,而使用.apply(str)时,时间信息将保留(或推断)。
为什么会这样?
(Pandas版本1.5.2,Python 3.9.15)

dl5txlt9

dl5txlt91#

时间信息永远不会丢失,如果使用2023-01-02 12:00,您将看到所有时间都将显示在astype中,而且在原始datetime列中也可见:

dt_column      str_from_astype       str_from_apply
0 2023-01-01 00:00:00  2023-01-01 00:00:00  2023-01-01 00:00:00
1 2023-01-02 00:00:00  2023-01-02 00:00:00  2023-01-02 00:00:00
2 2023-01-02 12:00:00  2023-01-02 12:00:00  2023-01-02 12:00:00

对于apply,python str内置函数应用于每个Timestamp对象,它总是显示完整的格式:

str(pd.Timestamp('2023-01-01'))
# '2023-01-01 00:00:00'

对于astype,格式由pandas.io.formats.format.SeriesFormatter处理,pandas.io.formats.format.SeriesFormatter更聪明一些,它根据上下文(这里是Series中的其他值和非空时间的存在)决定输出格式。
显式的规范方法是使用dt.strftime

# without time
df["dt_column"].dt.strftime('%Y-%m-%d')

# with time
df["dt_column"].dt.strftime('%Y-%m-%d %H:%M:%S')

相关问题