Почему Python возвращает «TypeError» при передаче столбца со строковыми данными в метод lookup () из пакета «us»? - PullRequest
0 голосов
/ 29 мая 2019

Я хочу исправить соответствующие времена данных для их часовых поясов, используя пакет «us» для извлечения метода часового пояса и панд «tz_covert ()», чтобы применить исправление, но получаю ошибку «TypeError: ожидаемая строка или байты- как объект "

Я попытался привести соответствующий столбец к строке типа с помощью df ['StateCode'] = df ['StateCode']. Astype (str)

posting_time = (
    df
    .loc[:, ['shipment_id', 'courier_id', 'posted_at','StateCode']]
    .drop_duplicates(subset=['shipment_id','courier_id'], keep='first')
    .assign(
        posted_at_dt=lambda x: pd.to_datetime(x['posted_at'])\
        .dt.tz_localize(pytz.utc)\
        .dt.tz_convert(us.states.lookup(x['StateCode']).capital_tz)
    )
)

Мой фрейм данных выглядит так:

shipment_id courier_id  posted_at   StateCode
0   14      228898  2019-02-19 13:18:55 MI
1   91919   196838  2019-01-19 19:29:02 TX
2   92187   196838  2019-01-19 19:29:28 TX
3   92736   196838  2019-01-19 19:29:46 TX
4   92760   196838  2019-01-19 19:29:59 TX

Я сузил проблему до:

us.states.lookup(x['StateCode']).capital_tz

Но "x ['StateCode']" должен быть строковым типом, поэтому я не уверен, почему я получаю "TypeError: ожидаемая строка или байтовоподобный объект"?

1 Ответ

0 голосов
/ 29 мая 2019

Используйте понимание списка или примените функцию, работающую по строкам DataFrame:

posting_time = (
    df
    .loc[:, ['shipment_id', 'courier_id', 'posted_at','StateCode']]
    .drop_duplicates(subset=['shipment_id','courier_id'], keep='first')
    .assign(
        posted_at_dt=lambda x: pd.to_datetime(x['posted_at'])\
        .dt.tz_localize(pytz.utc)
    )
)

posting_time['posted_at_dt'] = [a.tz_convert(us.states.lookup(b).capital_tz) 
                               for a, b in zip(posting_time['posted_at_dt'], 
                                               posting_time['StateCode'])]
print (posting_time)
   shipment_id  courier_id            posted_at StateCode  \
0           14      228898  2019-02-19 13:18:55        MI   
1        91919      196838  2019-01-19 19:29:02        TX   
2        92187      196838  2019-01-19 19:29:28        TX   
3        92736      196838  2019-01-19 19:29:46        TX   
4        92760      196838  2019-01-19 19:29:59        TX   

                posted_at_dt  
0  2019-02-19 08:18:55-05:00  
1  2019-01-19 13:29:02-06:00  
2  2019-01-19 13:29:28-06:00  
3  2019-01-19 13:29:46-06:00  
4  2019-01-19 13:29:59-06:00  

Или:

posting_time['posted_at_dt']  =  posting_time.apply(lambda x: x['posted_at_dt'].tz_convert(us.states.lookup(x['StateCode']).capital_tz), axis=1)                       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...