【问题标题】:Error converting month number to datetime object将月份数转换为日期时间对象时出错
【发布时间】:2018-10-15 01:49:44
【问题描述】:

尝试将数据框中的列从 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,因为当我尝试使用 'd' 而不是 '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

【问题讨论】:

  • 预期输出是什么?
  • @harv 我编辑了问题

标签: python python-2.7 pandas datetime


【解决方案1】:

你应该使用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)))]

【讨论】:

  • 这会在几分钟内上升,而不是几个月,当我尝试大写 M 几个月时,它给出了同样的错误
  • 这适用于这个示例数据,但不适用于我的实际数据 - 对于我的实际数据,我需要将包含从 1:420 的数字的列转换为从 01/01/1981 到 01 的列/12/2015。这不起作用,因为我收到错误ValueError: Length of values does not match length of index。它与索引的长度不匹配,因为索引的长度为 200,000 行,但数字 1-420 始终重复出现。我需要将每个 1 转换为 01/01/1981,每个 2 转换为 01/02/1981 等。当我对日期时间参数进行几天而不是几个月时,这有效。
  • 好像这个功能has been deprecated
  • @Pad 你是对的。虽然,有一个解决方法。我尝试了超过 420 行的问题。这给了我一个重复的索引。尝试这个。让我知道它是否有效。获取您想要重复的对象列表。 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)))]
  • 谢谢 - 对不起,我现在才看到这个,因为我没有 wifi。当我尝试将您所做的应用于我的数据框中的列时,我收到错误TypeError: can't multiply sequence by non-int of type 'float' - 当我尝试转换为 int 时,它会给出更多错误!
猜你喜欢
  • 2017-02-07
  • 2022-01-26
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 2014-06-18
  • 2017-01-08
  • 2018-11-03
  • 1970-01-01
相关资源
最近更新 更多