我正在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)
1条答案
按热度按时间dl5txlt91#
时间信息永远不会丢失,如果使用
2023-01-02 12:00
,您将看到所有时间都将显示在astype
中,而且在原始datetime列中也可见:对于
apply
,pythonstr
内置函数应用于每个Timestamp
对象,它总是显示完整的格式:对于
astype
,格式由pandas.io.formats.format.SeriesFormatter
处理,pandas.io.formats.format.SeriesFormatter
更聪明一些,它根据上下文(这里是Series中的其他值和非空时间的存在)决定输出格式。显式的规范方法是使用
dt.strftime
: