Pandas 正在将第 10 个月转换为第 1 个月。是否存在格式问题?

Pandas is converting month 10 into month 1. Is there a format issue here?

我有以下 DataFrame

    data  inflation
0   2000.01       0.62
1   2000.02       0.13
2   2000.03       0.22
3   2000.04       0.42
4   2000.05       0.01
5   2000.06       0.23
6   2000.07       1.61
7   2000.08       1.31
8   2000.09       0.23
9   2000.10       0.14

注意年月的格式是带点的 当我尝试转换为 DateTime 时:

inflation.data = pd.to_datetime(inflation.data, format='%Y.%m')

我将第 0 行和第 9 行都设为 2000-01-01

这意味着 pandas 会自动将 .10 更改为 .01

这是一个错误吗?或者只是格式问题?

这是一个有趣的问题。 astype() 构造正在将 .10 转换为 .01,您不能对当前浮点类型使用任何拆分方法。 这是我对此的看法: 使用 python 数学模块 modf 函数,其中 returns x 的小数部分和整数部分。 现在将年和月数据四舍五入并转换为字符串供 to_datetime 解释。

import math

df['Year']= df.data.apply(lambda x: round(math.modf(x)[1])).astype(str)
df['Month']= df.data.apply(lambda x: round((math.modf(x)[0])*100)).astype(str)
df = df.drop('data', axis = 1)
df['Date'] = pd.to_datetime(df.Year+':'+df.Month, format = '%Y:%m')
df = df.drop(['Year', 'Month'], axis = 1)

你得到

    inflation   Date
0   0.62        2000-01-01
1   0.13        2000-02-01
2   0.22        2000-03-01
3   0.42        2000-04-01
4   0.01        2000-05-01
5   0.23        2000-06-01
6   1.61        2000-07-01
7   1.31        2000-08-01
8   0.23        2000-09-01
9   0.14        2000-10-01

您实际上使用 pandas 中的格式代码有点不正确。

看看Pandashelpfile

pandas.to_datetime(*args, **kwargs)[source]

Convert argument to datetime.

Parameters:

arg : string, datetime, list, tuple, 1-d array, Series

当它可能需要字符串时,你似乎在喂它 float64s

试试下面的代码。

或者将您的 inflation.data 转换为字符串(使用 inflation.data.apply(str)

 f0=['2000.01',
   '2000.02',
   '2000.03',
   '2000.04',
   '2000.05',
   '2000.06',       
   '2000.07',       
   '2000.08',       
   '2000.09',
   '2000.10']
 inflation=pd.DataFrame(f0,columns={'data'})
 inflation.data=pd.to_datetime(inflation.data,format='%Y.%m')

输出

Out[3]: 
0   2000-01-01
1   2000-02-01
2   2000-03-01
3   2000-04-01
4   2000-05-01
5   2000-06-01
6   2000-07-01
7   2000-08-01
8   2000-09-01
9   2000-10-01
Name: data, dtype: datetime64[ns]