Извлечь дату из pandas.core.series.Series в столбцы данных pandas - PullRequest
0 голосов
/ 26 марта 2019

Для загрузки выходных дней в Германии через веб-интерфейс API и преобразования данных json в фрейм данных pandas я использую следующий код (python 3):

import datetime
import requests
import pandas as pd


now  = datetime.datetime.now()
year = now.year
URL  ='https://feiertage-api.de/api/?jahr='+ str(year)
r    = requests.get(URL)
df   = pd.DataFrame(r.json())

Цель - это фрейм данных pandas, похожий на (рисунок= раздел кадра данных):

enter image description here

Проблема: «столбцы» - это pandas.core.series.Series, и я не могу понять, как извлечьдата с использованием различных версий

df['BW'].str.split(", ", n = 0, expand = True) 

См. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.str.split.html

Кто-нибудь может мне помочь превратить df в "правильный" фрейм данных со столбцами, которые содержат только даты?

Ответы [ 2 ]

2 голосов
/ 26 марта 2019

Один из подходов - сделать df.applymap(lambda x: '' if pd.isna(x) else x['datum']):

In [21]: df.applymap(lambda x: '' if pd.isna(x) else x['datum'])
Out[21]:
                                   BW          BY          BE          BB          HB  ...          SN          ST          SH          TH    NATIONAL
1. Weihnachtstag           2019-12-25  2019-12-25  2019-12-25  2019-12-25  2019-12-25  ...  2019-12-25  2019-12-25  2019-12-25  2019-12-25  2019-12-25
2. Weihnachtstag           2019-12-26  2019-12-26  2019-12-26  2019-12-26  2019-12-26  ...  2019-12-26  2019-12-26  2019-12-26  2019-12-26  2019-12-26
Allerheiligen              2019-11-01  2019-11-01                                      ...
Augsburger Friedensfest                2019-08-08                                      ...
Buß- und Bettag                        2019-11-20                                      ...  2019-11-20
Christi Himmelfahrt        2019-05-30  2019-05-30  2019-05-30  2019-05-30  2019-05-30  ...  2019-05-30  2019-05-30  2019-05-30  2019-05-30  2019-05-30
Frauentag                                          2019-03-08                          ...
Fronleichnam               2019-06-20  2019-06-20                                      ...  2019-06-20                          2019-06-20
Gründonnerstag             2019-04-18                                                  ...
Heilige Drei Könige        2019-01-06  2019-01-06                                      ...              2019-01-06
Karfreitag                 2019-04-19  2019-04-19  2019-04-19  2019-04-19  2019-04-19  ...  2019-04-19  2019-04-19  2019-04-19  2019-04-19  2019-04-19
Mariä Himmelfahrt                      2019-08-15                                      ...
Neujahrstag                2019-01-01  2019-01-01  2019-01-01  2019-01-01  2019-01-01  ...  2019-01-01  2019-01-01  2019-01-01  2019-01-01  2019-01-01
Ostermontag                2019-04-22  2019-04-22  2019-04-22  2019-04-22  2019-04-22  ...  2019-04-22  2019-04-22  2019-04-22  2019-04-22  2019-04-22
Ostersonntag                                                   2019-04-21              ...
Pfingstmontag              2019-06-10  2019-06-10  2019-06-10  2019-06-10  2019-06-10  ...  2019-06-10  2019-06-10  2019-06-10  2019-06-10  2019-06-10
Pfingstsonntag                                                 2019-06-09              ...
Reformationstag            2019-10-31                          2019-10-31  2019-10-31  ...  2019-10-31  2019-10-31  2019-10-31  2019-10-31
Tag der Arbeit             2019-05-01  2019-05-01  2019-05-01  2019-05-01  2019-05-01  ...  2019-05-01  2019-05-01  2019-05-01  2019-05-01  2019-05-01
Tag der Deutschen Einheit  2019-10-03  2019-10-03  2019-10-03  2019-10-03  2019-10-03  ...  2019-10-03  2019-10-03  2019-10-03  2019-10-03  2019-10-03
1 голос
/ 26 марта 2019

Вы можете попытаться исправить форму ввода (то есть ответ json) перед построением фрейма данных, а затем изменить его при необходимости.

пример:

import datetime
import requests
import pandas as pd


now  = datetime.datetime.now()
year = now.year
URL  ='https://feiertage-api.de/api/?jahr='+ str(year)
r    = requests.get(URL)
df = pd.DataFrame(
  [(k1,k2,k3,v3) 
   for k1, v1 in r.json().items() 
   for k2, v2 in v1.items() 
   for k3, v3 in v2.items()]
)

df.head()
# Outputs: 
    0                    1        2           3
0  BW          Neujahrstag    datum  2019-01-01
1  BW          Neujahrstag  hinweis
2  BW  Heilige Drei Könige    datum  2019-01-06
3  BW  Heilige Drei Könige  hinweis
4  BW       Gründonnerstag    datum  2019-04-18

# it is easier to see what is happening if we
# fix the column names

df.columns = ['State', 'Holiday', 'value_type', 'value']
pivoted = df[df.value_type == 'datum'].set_index(['Holiday', 'State']).value.unstack(-1)

pivoted.head()
# Outputs:

State                            BB          BE          BW     ...              SN          ST          TH
Holiday                                                         ...
1. Weihnachtstag         2019-12-25  2019-12-25  2019-12-25     ...      2019-12-25  2019-12-25  2019-12-25
2. Weihnachtstag         2019-12-26  2019-12-26  2019-12-26     ...      2019-12-26  2019-12-26  2019-12-26
Allerheiligen                   NaN         NaN  2019-11-01     ...             NaN         NaN         NaN
Augsburger Friedensfest         NaN         NaN         NaN     ...             NaN         NaN         NaN
Buß- und Bettag                 NaN         NaN         NaN     ...      2019-11-20         NaN         NaN

[5 rows x 17 columns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...