将月号转换为datetime对象时出错

时间:2018-05-04 14:22:59

标签: python python-2.7 pandas datetime

尝试将数据框中的列从1-420个月(1985年到2010年的35年月度数据)转换为日期时间对象。

示例数据框:

import pandas as pd
import numpy as np
dates = pd.Series(range(1,421))
df2 = pd.DataFrame(np.random.randn(420,4),index=dates,columns=list('ABCD'))

将索引转换为日期时间对象:

df2.index = pd.to_datetime(df2.index,unit='M', origin='1981-01-01')

给出错误:

ValueError: cannot cast unit M

我不知道为什么它不会投射单位M,就像我尝试的那样。而不是' M'它有效,并且每天上升 - 为什么每月都会上升?我从here得到了单位。

使用' m'输出看起来像这样:

                       A           B            C            D
1981-01-01 00:01:00 0.672397    0.753926    0.865845    0.711594
1981-01-01 00:02:00 0.786754    0.658421    -0.111609   -1.459447
1981-01-01 00:03:00 0.200273    -1.485525   -1.939203   0.921833
1981-01-01 00:04:00 -1.589668   0.109760    -1.349790   -1.951316
1981-01-01 00:05:00 0.133847    -0.359300   -1.246740   -0.835645
1981-01-01 00:06:00 -0.843962   1.222129    -0.121450   -1.223132
1981-01-01 00:07:00 -0.818932   0.731127    0.984731    -1.028384

在几分钟内上升,我希望它在几个月内上升:

                            A           B            C           D
    1981-01-01 00:00:00 0.672397    0.753926    0.865845    0.711594
    1981-02-01 00:00:00 0.786754    0.658421    -0.111609   -1.459447
    1981-03-01 00:00:00 0.200273    -1.485525   -1.939203   0.921833

1 个答案:

答案 0 :(得分:2)

您应该使用date_range

df2.index = pd.date_range('1981/1/1', periods=len(df2), freq='MS')

输出:

                A           B           C            D
1981-01-01  -0.761933   0.726808    0.589712    -1.170934
1981-02-01  0.030521    -0.892427   -1.366809   -1.515724
1981-03-01  -0.282887   1.068047    0.244493    -0.247356

有关详细信息,请查看offset alias

编辑:正如OP所说,425天重复超过200,000行。下面的代码将提供重复索引。

daterange = pd.date_range('1981/1/1', periods=420, freq='MS') 

然后通过重复它来展开它以适合您的数据框。

df2.index = list(daterange) * math.floor(len(df2)/len(list(daterange))) + list(daterange)[0:math.floor(len(df2)%len(list(daterange)))]