熊猫将第10个月转换为第1个月。这里有格式问题吗?

时间:2017-04-28 19:16:35

标签: python-3.x pandas datetime-format

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

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

2 个答案:

答案 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