Функция Datetime Pandas только для преобразования одной серии - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю с несколькими фреймами данных панд, каждый из которых имеет временные метки в формате, например: «2018-01-01 00:00:00 UTC».Я написал функцию, позволяющую сканировать каждый столбец информационного кадра и изменять столбцы, в которых есть данные в этом формате.Вот функция:

def utc_converter(dataframe, timezone):
    columns = dataframe.columns.tolist()
    for column in columns:
        try:
            s = pd.to_datetime(dataframe[column], format='%Y-%m-%d %H:%M:%S UTC', utc=True)
        except ValueError:
            continue
        s.dt.tz_convert(timezone)
        s = s.dt.strftime('%m/%d/%Y %H:%M:%S')
        dataframe[column] = s
    dataframe = dataframe.replace(to_replace=pd.NaT, value=np.nan)
    return dataframe

По какой-то причине всякий раз, когда я запускаю функцию на фрейме данных, она перехватывает только первый столбец и не перебирает все остальные.Кто-нибудь знает, что я сделал не так?Я немного почесал голову.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Вы можете просто рассмотреть первую строку, чтобы определить , какие столбцы находятся в области видимости.Затем используйте pd.to_datetime для выбранных столбцов через pd.DataFrame.apply.Вот демо:

df = pd.DataFrame([['2018-01-01 00:00:00 UTC', 0, 341.3214, 'test1',
                    '2019-01-01 00:00:00 UTC'],
                   ['2015-01-01 00:00:00 UTC', 46, 235.54, 'test2',
                    '2020-01-01 00:00:00 UTC']],
                  columns=['date1', 'int', 'float', 'string', 'date2'])

dt_format = '%Y-%m-%d %H:%M:%S UTC'
L = [pd.to_datetime(i, errors='coerce', format=dt_format) for i in df.iloc[0].values]
dt_cols = df.columns[pd.Series(L).notnull()]

df[dt_cols] = df[dt_cols].apply(pd.to_datetime, format=dt_format)

Результат:

print(df)

       date1  int     float string      date2
0 2018-01-01    0  341.3214  test1 2019-01-01
1 2015-01-01   46  235.5400  test2 2020-01-01

print(df.dtypes)

date1     datetime64[ns]
int                int64
float            float64
string            object
date2     datetime64[ns]
dtype: object
0 голосов
/ 28 сентября 2018

Вы можете использовать pd.to_datetime(), с strftime(), чтобы переформатировать ваши даты:

df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m-%d %H:%M:%S UTC', utc=True).dt.strftime('%m/%d/%Y %H:%M:%S')

Обратите внимание, что это вернет столбец типа str, поэтому преобразовать обратно в datetime просто сделайте:

df['Date'] = pd.to_datetime(df['Date'], format='%m/%d/%Y %H:%M:%S')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...