从pandas数据框列中的pandas.core.series.Series中提取日期

时间:2019-03-26 12:31:28

标签: python json pandas split

要通过网络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())

目标是一个熊猫数据框,看起来像(图片=数据框的一部分):

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 个答案:

答案 0 :(得分:2)

一种方法是进行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 :(得分:1)

您可以在构造数据框之前尝试固定输入的形状(即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]