【问题标题】:OverflowError: date value out of range when converting matlab datenum to python datetime溢出错误:将matlab datenum转换为python datetime时日期值超出范围
【发布时间】:2021-07-26 04:33:57
【问题描述】:

我正在尝试使用以下函数将 matlab datenum 格式的 pandas 数据框列转换为 python 日期时间格式:

def datenum_to_datetime(datenum):
    """
    Convert Matlab datenum into Python datetime.
    :param datenum: Date in datenum format
    :return:        Datetime object corresponding to datenum.
    """
    days = datenum % 1
    date = datetime.fromordinal(int(datenum)) \
           + timedelta(days=days) \
           - timedelta(days=366)
 
    return date.year

值的样本

0         693726
1         693726
2         693726
3         693726
4         693726
           ...  
460718    726831
460719    726831
460720    726831
460721    726831
460722    726831
Name: dob, Length: 460723, dtype: int32

但是当我尝试应用该功能时出现以下错误。

df['dob'] = df['dob'].apply(datenum_to_datetime)

OverflowError                             Traceback (most recent call last)
<ipython-input-67-cc4fb607b497> in <module>()
----> 1 df['dob'] = df['dob'].apply(datenum_to_datetime)
      2 df.head()

1 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-66-bab915eae5ff> in datenum_to_datetime(datenum)
      6     """
      7     days = datenum % 1
----> 8     date = datetime.fromordinal(int(datenum))            + timedelta(days=2)            - timedelta(days=366)
      9 
     10     return date.year

OverflowError: date value out of range

【问题讨论】:

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


【解决方案1】:

在Converting Matlab's datenum format to Python 之后没有找到单一的解决方案,但是这个函数可以正常工作

def datenum_to_datetime(datenum):
    """
    Convert Matlab datenum into Python datetime.
    :param datenum: Date in datenum format
    :return:        Datetime object corresponding to datenum.
    """
    origin = np.datetime64('0000-01-01', 'D') - np.timedelta64(1, 'D')
    date = datenum * np.timedelta64(1, 'D') + origin
    year = date.astype('datetime64[Y]').astype(int) + 1970
 
    return year

【讨论】:

  • 我检查了你的代码,它适用于 pandas 1.2.4 / numpy 1.20.2 但似乎在旧版本中失败。此外,here 描述的方法对我来说似乎要简单得多(基本上只是pd.to_datetime(df['datenum']-719529, unit='D'))。一旦你有一个日期时间类型的列,你可以得到像df['datetime'].dt.year这样的年份。
  • 您提出的方法似乎更好,但是在 pandas 1.1.5 版上使用它时出现此错误。 OutOfBoundsDatetime: cannot convert input with unit 'D'
  • 同样的问题,它实际上适用于某些 datenum 输入,而不是全部。
  • 也许结果日期时间实际上是 out of range?
  • 它适用于 datenum = 656178 date = pd.to_datetime((datenum-719529)*86400, unit='s') year = date.year 结果为 1796,但 datenum = 600000 给出 OutOfBoundsDatetime: cannot convert input with unit 's'。而且我的数据框中确实有非常低的值,例如 146、25 等。我想知道这个错误。您可能可以尝试转换 600000 并查看其结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
相关资源
最近更新 更多