不使用Apply或Map的日期时间操作

2024-03-29 08:15:05 发布

您现在位置:Python中文网/ 问答频道 /正文

在列上使用apply()可以很容易地转换pandas的datetime对象,但我遇到的问题是转换速度非常慢。你知道吗

我正在尝试开发另一个解决方案,但我一直遇到性能问题。你知道吗

我目前的解决方案是:

def modify_date2(x):
    """
    applies datetime mask 1 of MM YYYY to the data
    Example: 01 2016
    """
    try:
        if pd.isnull(x) == False:
            return x.strftime('%m %Y')
        else:
            return pd.NaT
    except:
        return pd.NaT
df['columnname'] = df['columnname'].apply(modify_date2)

对于大约70万条记录,需要3分钟,这只是我的生产数据集的一个子集,它是2300多万条记录。你知道我的担心。你知道吗

我试过这个:

df.ix[pd.notnull(df['sourcedt']), "sourcedt"] = \
datetime.fromtimestamp(mktime(df['sourcedt'].dt.timetuple()))

但我无法根据收到的错误消息对“Series”进行低级别转换。查询工作正常,我可以使用pd.notnull()没有问题,但值的设置是我的问题。你知道吗

有什么办法可以加快速度吗? 我的源数据正在使用pd.DataFrame.from\记录(). 你知道吗

我使用的是Pandas 0.16.1、Python 2.7.10

谢谢


Tags: 数据pandasdfdatetimereturn记录解决方案nat
1条回答
网友
1楼 · 发布于 2024-03-29 08:15:05

IIUC您可以使用^{}columnname的数据类型是datetime

print (df)
  text          columnname
0    a 2016-06-13 18:00:00
1    b                 NaT
2    c 2016-07-11 19:07:00
3    d 2016-07-11 19:07:00
4    e 2016-08-01 16:00:00

print (df['columnname'].dt.strftime('%m %Y'))
0    06 2016
1        NaT
2    07 2016
3    07 2016
4    08 2016
Name: columnname, dtype: object

如果需要首先转换为datetime,并且某些日期已损坏,请使用^{}

df['columnname'] = pd.to_datetime(df['columnname'], errors='coerce').dt.strftime('%m %Y')

样品:

df = pd.DataFrame({'columnname': {0: '2016-06-13 18:00', 1: np.nan, 2: 'dd', 3: '2016-07-11 19:07', 4: '2016-08-01 16:00'}, 'text': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e'}})
print (df)
         columnname text
0  2016-06-13 18:00    a
1               NaN    b
2                dd    c
3  2016-07-11 19:07    d
4  2016-08-01 16:00    e

df['columnname'] = pd.to_datetime(df['columnname'], errors='coerce').dt.strftime('%m %Y')
print (df)
  columnname text
0    06 2016    a
1        NaT    b
2        NaT    c
3    07 2016    d
4    08 2016    e

相关问题 更多 >