programing

팬더 데이터 프레임에 누락된 날짜 추가

goodsources 2022. 9. 14. 22:31
반응형

팬더 데이터 프레임에 누락된 날짜 추가

데이터에는 특정 날짜에 여러 이벤트가 있을 수도 있고 날짜에 이벤트가 없을 수도 있습니다.난 이 사건들을 날짜별로 세고 계획해.하지만 제가 플롯을 할 때, 저의 두 시리즈가 항상 일치하는 것은 아닙니다.

idx = pd.date_range(df['simpleDate'].min(), df['simpleDate'].max())
s = df.groupby(['simpleDate']).size()

위의 코드 idx는 "30일"의 범위가 됩니다.그러나 S는 지정된 날짜에 아무런 사건도 발생하지 않았기 때문에 25일 또는 26일만 있을 수 있습니다.플롯을 작성하려고 하면 크기가 일치하지 않기 때문에 AssertionError가 표시됩니다.

fig, ax = plt.subplots()    
ax.bar(idx.to_pydatetime(), s, color='green')

어떻게 대처하면 좋을까요?값이 없는 날짜를 IDX에서 제거하시겠습니까? 아니면 숫자 0의 누락된 날짜를 시리즈에 추가하시겠습니까?값이 0인 30일의 전체 그래프가 좋습니다.이 방법이 맞다면 어떻게 시작할지 제안해 주시겠습니까?동적인 요소가 필요합니까?reindex능하하??? ???

다음은 S의 일부입니다(df.groupby(['simpleDate']).size()및 0504 의

09-02-2013     2
09-03-2013    10
09-06-2013     5
09-07-2013     1

하면 .Series.reindex:

import pandas as pd

idx = pd.date_range('09-01-2013', '09-30-2013')

s = pd.Series({'09-02-2013': 2,
               '09-03-2013': 10,
               '09-06-2013': 5,
               '09-07-2013': 1})
s.index = pd.DatetimeIndex(s.index)

s = s.reindex(idx, fill_value=0)
print(s)

수율

2013-09-01     0
2013-09-02     2
2013-09-03    10
2013-09-04     0
2013-09-05     0
2013-09-06     5
2013-09-07     1
2013-09-08     0
...

보다 신속한 회피책은 를 사용하는 것입니다.호출할 새 인덱스를 생성할 필요가 없습니다..reindex().

# "broken" (staggered) dates
dates = pd.Index([pd.Timestamp('2012-05-01'), 
                  pd.Timestamp('2012-05-04'), 
                  pd.Timestamp('2012-05-06')])
s = pd.Series([1, 2, 3], dates)

print(s.asfreq('D'))
2012-05-01    1.0
2012-05-02    NaN
2012-05-03    NaN
2012-05-04    2.0
2012-05-05    NaN
2012-05-06    3.0
Freq: D, dtype: float64

가지 은 한 one one one one one one one one one one one one one one one onereindex값이 중복되면 에러가 발생합니다.날짜별로 인덱싱할 타임스탬프 데이터를 사용하고 있다고 가정합니다.

df = pd.DataFrame({
    'timestamps': pd.to_datetime(
        ['2016-11-15 1:00','2016-11-16 2:00','2016-11-16 3:00','2016-11-18 4:00']),
    'values':['a','b','c','d']})
df.index = pd.DatetimeIndex(df['timestamps']).floor('D')
df

수율

            timestamps             values
2016-11-15  "2016-11-15 01:00:00"  a
2016-11-16  "2016-11-16 02:00:00"  b
2016-11-16  "2016-11-16 03:00:00"  c
2016-11-18  "2016-11-18 04:00:00"  d

된 ★★★★★★★★★★★★★★★★★★★★★★★.2016-11-16: date, "date" :

all_days = pd.date_range(df.index.min(), df.index.max(), freq='D')
df.reindex(all_days)

다음 항목에서 실패합니다.

...
ValueError: cannot reindex from a duplicate axis

(이는 인덱스가 중복됨을 의미하며, 그 자체가 이중임을 의미하지는 않습니다.)

ㅇㅇㅇㅇ를 사용하면 ..loc범위 내의 모든 날짜에 대한 항목을 검색하려면:

df.loc[all_days]

수율

            timestamps             values
2016-11-15  "2016-11-15 01:00:00"  a
2016-11-16  "2016-11-16 02:00:00"  b
2016-11-16  "2016-11-16 03:00:00"  c
2016-11-17  NaN                    NaN
2016-11-18  "2016-11-18 04:00:00"  d

fillna필요한 경우 컬럼 시리즈에서 빈칸을 채울 수 있습니다.

대체 접근법은 입니다.이 접근법은 누락된 날짜뿐만 아니라 중복된 날짜도 처리할 수 있습니다.예를 들어 다음과 같습니다.

df.resample('D').mean()

resample'하다'는 '하다'와 같은 연산을 .groupby이 경우mean먹히지만 , 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다, 판다 등 여러 가지 방법이 있습니다.max,sum 등등.

다음은 원본 데이터이지만 '2013-09-03'에 대한 추가 항목 포함:

             val
date           
2013-09-02     2
2013-09-03    10
2013-09-03    20    <- duplicate date added to OP's data
2013-09-06     5
2013-09-07     1

결과는 다음과 같습니다.

             val
date            
2013-09-02   2.0
2013-09-03  15.0    <- mean of original values for 2013-09-03
2013-09-04   NaN    <- NaN b/c date not present in orig
2013-09-05   NaN    <- NaN b/c date not present in orig
2013-09-06   5.0
2013-09-07   1.0

「NaNs」, 「NaNs」를 할 수 .fillna(0)하거나 OP NaN 0을 합니다.interpolate()인접 행을 기준으로 0이 아닌 값으로 채웁니다.

누락된 프레임에 이 있습니다. 할 수 있습니다.fill_value,days_back기입, 정렬(date_order) 데이터 프레임 정렬 기준:

def fill_in_missing_dates(df, date_col_name = 'date',date_order = 'asc', fill_value = 0, days_back = 30):

    df.set_index(date_col_name,drop=True,inplace=True)
    df.index = pd.DatetimeIndex(df.index)
    d = datetime.now().date()
    d2 = d - timedelta(days = days_back)
    idx = pd.date_range(d2, d, freq = "D")
    df = df.reindex(idx,fill_value=fill_value)
    df[date_col_name] = pd.DatetimeIndex(df.index)

    return df

DataFrame.merge()는 항상 'All Dates' DataFrame에서 'Missing Dates' DataFrame으로 왼쪽 조인을 사용하여 사용할 수 있습니다.이하에 예를 다음에 나타냅니다.

## example DataFrame with missing dates between min(date) and max(date)
missing_df = pd.DataFrame({
    'date':pd.to_datetime([
        '2022-02-10'
        ,'2022-02-11'
        ,'2022-02-14'
        ,'2022-02-14'
        ,'2022-02-24'
        ,'2022-02-16'
    ])
    ,'value':[10,20,5,10,15,30]
})

## first create a DataFrame with all dates between specified start<-->end using pd.date_range()
all_dates = pd.DataFrame(pd.date_range(df['date'].min(), df['date'].max()), columns=['date'])

## from the all_dates DataFrame, left join onto the DataFrame with missing dates
new_df = all_dates.merge(right=missing_df, how='left', on='date')

new_df
s.asfreq('D').interpolate().asfreq('Q')

언급URL : https://stackoverflow.com/questions/19324453/add-missing-dates-to-pandas-dataframe

반응형