将pandas to_datetime应用于所有日期列

时间:2017-07-23 00:03:16

标签: python pandas

我正在尝试将通过read_csv作为对象的一些列to_datetime转换为。到目前为止,列名称始终包含术语DATE,_DT或时间戳。如果它在列表中,我不确定如何正确地解决我要转换的系列。

.parent {
  width: 100px;
  height: 100px;
  background: red;
}

.padding-example {
  padding: 10px;
}

.margin-example {
  margin: 10px;
}

这对于未知的字符串格式失败,我理解这是由引用列表中的字符串引起的。我不确定我需要在pd.to_datetime中放置什么来在循环的每次迭代中适当地引用Series。

5 个答案:

答案 0 :(得分:3)

试试这个:

PATTERN = r'DATE|_DT|TIMESTAMP'
date_cols = [c for c in df.columns if re.search(PATTERN, c)]

for col_name in date_cols:
    df[col_name] = pd.to_datetime(df[col_name])

如果您有列名列表,则迭代,更新每列。

答案 1 :(得分:2)

您可以使用正则表达式来查找日期列,然后使用apply循环并转换它们:

实施例

df = pd.DataFrame({
    "DATE1":["2017-01-01"],
    "XX_DT":["2017-01-01"],
    "M_TIMESTAMP":["2017-01-01"],
    "OTHERCOLUMN":[123],
})
​
import re
dt_cols = [col for col in df.columns if re.search("DATE|_DT|TIMESTAMP", col)]
df[dt_cols] = df[dt_cols].apply(pd.to_datetime)

df
#        DATE1  M_TIMESTAMP   OTHERCOLUMN        XX_DT
#0  2017-01-01   2017-01-01           123   2017-01-01

df.dtypes
#DATE1          datetime64[ns]
#M_TIMESTAMP    datetime64[ns]
#OTHERCOLUMN             int64
#XX_DT          datetime64[ns]
#dtype: object

答案 2 :(得分:2)

您可以在str个对象以及pd.Index个对象上使用pd.Series字符串访问器。 pd.DataFrame.update将使用传递的参数更新数据框df。因此,我所做的是使用pd.Index.str.contains确定的布尔数组切割数据帧,其正则值为'DATE|_DT|TIMESTAMP'。然后我应用pd.to_datetime并更新数据帧。

df.update(
    df.loc[:, df.columns.str.contains('DATE|_DT|TIMESTAMP')].apply(pd.to_datetime)
)

答案 3 :(得分:1)

list(df)df.columnsdf的工作方式同样出色。您也不需要使用正则表达式。检查每列是否包含任何已知模式就足够了。然后,只需将.to_datetime应用于与日期模式匹配的列。

date_patterns = ('DATE', '_DT', 'TIMESTAMP')
date_cols = [col for col in df if any(pattern in col for pattern in date_patterns)]
df.loc[:, date_cols] = df.loc[:, date_cols].apply(lambda x: pd.to_datetime(x))

答案 4 :(得分:1)

更紧凑,我的男人

df.filter(regex ='DATE|_DT|TIMESTAMP', axis =1 ).apply(pd.to_datetime)