как преобразовать строковый формат даты, используя ISO 8601 и номера недели - PullRequest
2 голосов
/ 01 апреля 2020

У меня есть это:

import pandas as pd
data = pd.DataFrame({'Date': ['2019-01-30', '2019-12-31', '2018-12-31']})
data['Date'] = pd.to_datetime(data.Date)
data['Period'] = data.Date.dt.strftime('Y%G-W%V')
data['Period'] = data['Period'] + '-7'
pd.to_datetime(data.Period, format='Y%G-W%V-%u')

и у меня есть эта ошибка (правка):

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/ph_test/lib/python3.7/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
    376             try:
--> 377                 values, tz = conversion.datetime_to_datetime64(arg)
    378                 return DatetimeIndex._simple_new(values, name=name, tz=tz)

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

TypeError: Unrecognized value type: <class 'str'>

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-1-963014b2e6bc> in <module>
      4 data['Period'] = data.Date.dt.strftime('Y%G-W%V')
      5 data['Period'] = data['Period'] + '-7'
----> 6 pd.to_datetime(data.Period, format='Y%G-W%V-%u')

~/ph_test/lib/python3.7/site-packages/pandas/core/tools/datetimes.py in to_datetime(arg, errors, dayfirst, yearfirst, utc, box, format, exact, unit, infer_datetime_format, origin, cache)
    449         else:
    450             from pandas import Series
--> 451             values = _convert_listlike(arg._values, True, format)
    452             result = Series(values, index=arg.index, name=arg.name)
    453     elif isinstance(arg, (ABCDataFrame, MutableMapping)):

~/ph_test/lib/python3.7/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
    378                 return DatetimeIndex._simple_new(values, name=name, tz=tz)
    379             except (ValueError, TypeError):
--> 380                 raise e
    381 
    382     if arg is None:

~/ph_test/lib/python3.7/site-packages/pandas/core/tools/datetimes.py in _convert_listlike(arg, box, format, name, tz)
    345                     try:
    346                         result = array_strptime(arg, format, exact=exact,
--> 347                                                 errors=errors)
    348                     except tslib.OutOfBoundsDatetime:
    349                         if errors == 'raise':

pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime()

pandas/_libs/tslibs/strptime.pyx in pandas._libs.tslibs.strptime.array_strptime()

ValueError: 'G' is a bad directive in format 'Y%G-W%V-%u'

любая идея, в основном я хочу использовать номера недель в ISO 8601, понедельник как день начала недели.

  • версия python: 3.7.5
  • версия pandas: 0.23.4

Я используя:

data.loc[:, 'end_date'] = data.Period.apply(lambda x:
                                            datetime.strptime(x + 'd7', 'Y%GW%Vd%u'))

, но у меня много данных и отнимает много времени

...