我有以下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
请注意,Year Month的格式为点 当我尝试转换为DateTime时,如:
inflation.data = pd.to_datetime(inflation.data, format='%Y.%m')
我将第0行和第9行都视为2000-01-01
这意味着大熊猫会自动将.10改为.01
这是一个错误吗?或只是格式问题?
答案 0 :(得分:2)
您实际上在pandas中使用的格式代码略有错误。
看看熊猫helpfile
pandas.to_datetime(* args,** kwargs)[来源]
将参数转换为datetime。
参数:
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]
答案 1 :(得分:1)
这是一个有趣的问题。 astype()构造将.10转换为.01,并且您无法在当前float类型上使用任何split方法。 以下是我对此的看法: 使用python math module modf函数返回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