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]
我有以下 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]