【问题标题】:how to convert jalali date string to python date time object with pandas.to_datetime如何使用 pandas.to_datetime 将 jalali 日期字符串转换为 python 日期时间对象
【发布时间】:2020-11-03 19:18:39
【问题描述】:

我在使用 pandas.to_datetime 将 jalali 日期字符串转换为 python 日期时间对象 时遇到了一些问题 例如,当我运行这个简单的代码时:

print(pd.to_datetime('1399/05/02',format='%Y/%m/%d'))

我收到了这个错误:

TypeError                                 Traceback (most recent call last)
~\anaconda3\envs\tf2\lib\site-packages\pandas\core\arrays\datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)
   1857         try:
-> 1858             values, tz_parsed = conversion.datetime_to_datetime64(data)
   1859             # If tzaware, these values represent unix timestamps, so we

pandas\_libs\tslibs\conversion.pyx in pandas._libs.tslibs.conversion.datetime_to_datetime64()

TypeError: Unrecognized value type: 

During handling of the above exception, another exception occurred:

OutOfBoundsDatetime                       Traceback (most recent call last)
 in 
      1 #dbs.Irdate = pd.to_datetime(dbs.Irdate,format='%Y/%m/%d',yearfirst = True)
----> 2 print(pd.to_datetime('1399/05/02',format='%Y/%m/%d'))

~\anaconda3\envs\tf2\lib\site-packages\pandas\core\tools\datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, format, exact, unit, infer_datetime_format, origin, cache)
    754             result = convert_listlike(arg, format)
    755     else:
--> 756         result = convert_listlike(np.array([arg]), format)[0]
    757 
    758     return result

~\anaconda3\envs\tf2\lib\site-packages\pandas\core\tools\datetimes.py in _convert_listlike_datetimes(arg, format, name, tz, unit, errors, infer_datetime_format, dayfirst, yearfirst, exact)
    445             errors=errors,
    446             require_iso8601=require_iso8601,
--> 447             allow_object=True,
    448         )
    449 

~\anaconda3\envs\tf2\lib\site-packages\pandas\core\arrays\datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)
   1861             return values.view("i8"), tz_parsed
   1862         except (ValueError, TypeError):
-> 1863             raise e
   1864 
   1865     if tz_parsed is not None:

~\anaconda3\envs\tf2\lib\site-packages\pandas\core\arrays\datetimes.py in objects_to_datetime64ns(data, dayfirst, yearfirst, utc, errors, require_iso8601, allow_object)
   1852             dayfirst=dayfirst,
   1853             yearfirst=yearfirst,
-> 1854             require_iso8601=require_iso8601,
   1855         )
   1856     except ValueError as e:

pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas\_libs\tslib.pyx in pandas._libs.tslib.array_to_datetime()

pandas\_libs\tslibs\np_datetime.pyx in pandas._libs.tslibs.np_datetime.check_dts_bounds()

**OutOfBoundsDatetime: Out of bounds nanosecond timestamp: 1399-05-02 00:00:00**

所以 我使用此参数 errors='ignore' 来修复错误,但结果不可接受 例如:

print(pd.to_datetime('1399/05/02',format='%Y/%m/%d', errors='ignore'))

结果是:1399/05/02 所以你看不到任何变化 我想要这样的东西 1399-05-02 python 日期时间对象 请帮帮我

【问题讨论】:

    标签: python pandas dataframe datetime


    【解决方案1】:

    在熊猫中,日期时间有限制,请查看this

    In [92]: pd.Timestamp.min
    Out[92]: Timestamp('1677-09-21 00:12:43.145225')
    
    In [93]: pd.Timestamp.max
    Out[93]: Timestamp('2262-04-11 23:47:16.854775807')
    

    可能的解决方案是将值转换为每日周期,more info

    p = pd.Period('1399/05/02')
    print (p)
    1399-05-02
    

    或者使用纯python:

    from datetime import datetime
    
    d = datetime.strptime('1399/05/02', '%Y/%m/%d')
    print (d)
    1399-05-02 00:00:00
    

    带列的解决方案:

    df = pd.DataFrame({'dates':['1399/05/02','1999/05/02']})
    
    df['dates'] = df['dates'].apply(pd.Period)
    print (df)
            dates
    0  1399-05-02
    1  1999-05-02
    
    print (df['dates'].dtype)
    period[D]
    

    如果使用其他想法获取对象,而不是日期时间:

    from datetime import datetime
    
    df['dates'] = df['dates'].apply(lambda x: datetime.strptime(x, '%Y/%m/%d'))
    print (df['dates'].dtype)
    object
    

    【讨论】:

    • 感谢您在我使用 1399/04/31 时的回答,我得到 day is out of range for month 错误,例如:print(pd.Period("1399/04/31"))
    • @mahdi101 - 原因是每个四月只有30 days
    【解决方案2】:

    由于 pandas 以纳秒分辨率表示时间戳,因此可以使用 64 位整数表示的时间跨度被限制为大约 584 年。 Out of bounds nanosecond timestamp

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2015-03-24
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 2012-06-04
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多