【问题标题】:python dataframe converting multiple datetime formatspython数据框转换多种日期时间格式
【发布时间】:2015-09-17 19:04:18
【问题描述】:

我有一个这样的 pandas.dataframe('col' 列有两种格式):

    col                            val
'12/1/2013'                       value1
'1/22/2014 12:00:01 AM'           value2
'12/10/2013'                      value3
'12/31/2013'                      value4 

我想将它们转换为日期时间,我正在考虑使用:

test_df['col']= test_df['col'].map(lambda x: datetime.strptime(x, '%m/%d/%Y'))    
test_df['col']= test_df['col'].map(lambda x: datetime.strptime(x, '%m/%d/%Y %H:%M %p'))

显然,它们中的任何一个都适用于整个 df。我正在考虑使用 try 和 except,但没有得到任何运气,有什么建议吗?

【问题讨论】:

  • for item in test_df.col: test_df.col = datetime.strptime(test_df.col, '%m/%d/%Y')
  • 你指的是pandas数据帧吗?
  • @Christopher Pearson 哦,对了!你的意思是对于每个项目,尝试和除外,对吧?谢谢!
  • @TigerhawkT3 是的! pandas。抱歉没有提及它...我已经更新了我的问题,谢谢。

标签: python datetime pandas dataframe


【解决方案1】:

只需使用to_datetime,就足以处理这两种格式:

In [4]:
df['col'] = pd.to_datetime(df['col'])
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 2 columns):
col    4 non-null datetime64[ns]
val    4 non-null object
dtypes: datetime64[ns](1), object(1)
memory usage: 96.0+ bytes

df 现在看起来像这样:

In [5]:
df

Out[5]:
                  col     val
0 2013-12-01 00:00:00  value1
1 2014-01-22 00:00:01  value2
2 2013-12-10 00:00:00  value3
3 2013-12-31 00:00:00  value4

【讨论】:

  • 我猜这个解决方案的问题是你提供了一种格式来加快速度 - 没有格式的 to_datetime 非常慢。
  • @Ian 是的,但如果你没有固定的格式,那么你必须这样做
  • @EdChum - 我认为如果你有合理的数据量,to_datetime 太慢了。我在下面添加了我的答案。
【解决方案2】:

我在同一列Temps中有两种不同的日期格式,类似于OP,如下所示;

01.03.2017 00:00:00.000
01/03/2017 00:13

两个不同的代码sn-ps的时序如下;

v['Timestamp1'] = pd.to_datetime(v.Temps)

耗时 25.5408718585968 秒

v['Timestamp'] = pd.to_datetime(v.Temps, format='%d/%m/%Y %H:%M', errors='coerce')
mask = v.Timestamp.isnull()
v.loc[mask, 'Timestamp'] = pd.to_datetime(v[mask]['Temps'], format='%d.%m.%Y %H:%M:%S.%f',
                                             errors='coerce')

耗时 0.2923243045806885 秒

换句话说,如果您的日期时间有少量已知格式,请不要使用没有格式的 to_datetime!

【讨论】:

  • 这是一个很好的解决方案,知道现实世界数据的痛苦,您甚至可以添加一个检查语句,如果在迭代已知日期格式后仍有空值,则将通用 to_datetime 应用于剩余值.除了上述速度改进之外,这将有助于将几天/几个月的混淆和产生错误结果的风险降到最低。
【解决方案3】:

您可以创建一个新列:

test_df['col1'] = pd.Timestamp(test_df['col']).to_datetime()

然后删除 col 并重命名 col1。

【讨论】:

    【解决方案4】:

    它对我有用。 我的专栏“fecha_hechos”中有两种格式。格式:

    • 2015/03/02
    • 10/02/2010

    我所做的是:

    carpetas_cdmx['Timestamp'] = pd.to_datetime(carpetas_cdmx.fecha_hechos, format='%Y/%m/%d %H:%M:%S', errors='coerce')
    mask = carpetas_cdmx.Timestamp.isnull()
    carpetas_cdmx.loc[mask, 'Timestamp'] = pd.to_datetime(carpetas_cdmx[mask]['fecha_hechos'], format='%d/%m/%Y %H:%M',errors='coerce')
    

    是:carpetas_cdmx 是我的 DataFrame 和fecha_hechos我的格式列

    【讨论】:

      猜你喜欢
      • 2022-09-27
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-24
      • 2018-09-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多