日期时间熊猫函数仅转换单个系列

时间:2018-09-28 16:21:37

标签: python pandas datetime dataframe

我正在处理几个熊猫数据帧,每个数据帧都带有时间戳,格式为:“ 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 :(得分:0)

您可以将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')

答案 1 :(得分:0)

您只需考虑第一行即可确定哪些列在范围内。然后通过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