为什么datetime64转成YYYY-MM字符串时会转成timedelta64

Why is datetime64 converted to timedelta64 when converting into a YYYY-MM string

我想将 panda.DataFrame 中的时间列 (dtype: datetime64[ns]) 转换为仅表示年份和月份的字符串。

如果列中的所有值都有效,它会按预期工作。

0     2019-4
1    2017-12
dtype: object

但是列中缺少值 (pandas.NaT) 结果让我很困惑。

0   -1 days +23:59:59.999979806
1   -1 days +23:59:59.999798288
2                           NaT
dtype: timedelta64[ns]

或者 .unique()array([ -20194, -201712, 'NaT'], dtype='timedelta64[ns]')

这里发生的事情似乎不知何故结果变成了 timedelta64。但我不明白为什么会这样。问题是为什么会这样?

完整示例代码:

#!/usr/bin/env pyhton3
import pandas as pd
import numpy as np

# series with missing values
series = pd.Series([
    np.datetime64('2019-04-08'),
    np.datetime64('2017-12-05')])

def year_month_string(cell):
    """Convert a datetime64 into string representation with
    year and month only.
    """
    if pd.isna(cell):
        return pd.NaT

    return '{}-{}'.format(cell.year, cell.month)

print(series.apply(year_month_string))
# 0     2019-4
# 1    2017-12
# dtype: object

# Series with a missing value
series_nat = pd.Series([
    np.datetime64('2019-04-08'),
    np.datetime64('2017-12-05'),
    pd.NaT])

result = series_nat.apply(year_month_string)
print(result)
# 0   -1 days +23:59:59.999979806
# 1   -1 days +23:59:59.999798288
# 2                           NaT
# dtype: timedelta64[ns]
print(result.unique())
# array([ -20194, -201712,   'NaT'], dtype='timedelta64[ns]')

不要使用自定义函数,使用 strftime%-m(减号去掉前导零):

series_nat.dt.strftime('%Y-%-m')

输出:

0     2019-4
1    2017-12
2        NaN
dtype: object

%m 将保留前导零:

series_nat.dt.strftime('%Y-%m')

输出:

0    2019-04
1    2017-12
2        NaN
dtype: object