我正在处理几个熊猫数据帧,每个数据帧都带有时间戳,格式为:“ 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
由于某种原因,每当我在数据帧上运行该函数时,它只会捕获第一列,而不会遍历其余所有列。有人知道我做错了什么吗?我已经挠了一下头。
谢谢!
答案 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