Функция для изменения формата даты в нескольких столбцах даты - PullRequest
1 голос
/ 04 августа 2020

У меня есть большой фрейм данных с несколькими форматами даты, и я хочу очистить этот набор данных, но мне хотелось узнать, возможно ли найти эти столбцы даты и изменить их форматы без единого покрытия одного столбца за раз.

Вот как я вытащил все столбцы, которые начинаются с префикса даты

date_df = df.loc[:,df.columns.str.startswith("date")] 

Затем отсюда я написал функцию для изменения формата даты со строки на datetime YMD.

from datetime import datetime
def date_fomated():
dates = df.loc[:,date_df.columns.datetime.strftime('%m/%d/%Y')]
return dates

Это не сработало. Мой ожидаемый результат - создание функции, которая подмножества столбцов даты с использованием префикса «date» форматирует даты в этих нескольких столбцах даты в YMD.

Вот небольшой набор данных для использования

import pandas as pd
data = [['2020-06-24','2020-01-24'],['2020-05-04','2020-06-24'],['2018-11-24','2018-11-24'],['2018-11-24','2018-11-24']]
df = pd.DataFrame(data,columns=['date_today','date_adm'],dtype=float)
print (df)

Пожалуйста, помогите

Ответы [ 2 ]

1 голос
/ 04 августа 2020

позволяет использовать stack и filter

df = pd.DataFrame({'date1' : ['20200105','20210305'],
                  'date2' : [20200103, 20210309],
                  'id' : [0,1] })


      date1     date2  id
0  20200105  20200103   0
1  20210305  20210309   1


df.loc[:,df.filter(like='date').columns] = df.filter(like='date')\
                                                .stack()\
                                                .apply(pd.to_datetime,
                                                       format='%Y%m%d')\
                                                .unstack()
print(df)

       date1      date2  id
0 2020-01-05 2020-01-03   0
1 2021-03-05 2021-03-09   1

print(df.dtypes)

date1    datetime64[ns]
date2    datetime64[ns]
id                int64
dtype: object
1 голос
/ 04 августа 2020

Отфильтруйте, используя df.filter(like='date', axis=1) (содержит 'date') или df.filter(regex='^date', axis=1)(starts with date) and apply pd.to_datetime to the df`

Исходные типы df

 df.filter(like='date', axis=1).dtypes#filter columns that contain date and check their dtypes
    
    df.dtypes
    date_today    object
    date_adm      object
    dtype: object

Решение

df.filter(like='date', axis=1).apply(lambda x: pd.to_datetime(x))

Новые типы

df.filter(like='date', axis=1).apply(lambda x: pd.to_datetime(x)).dtypes


df.dtypes
date_today    datetime64[ns]
date_adm      datetime64[ns]
dtype: object
...