Pandas - 日期时间操作不使用应用或映射

时间:2016-08-02 12:15:43

标签: python datetime pandas

你可以转换大熊猫' datetime对象非常容易在列上使用apply(),但我遇到的问题是它真的很慢。

我正在尝试开发另一种解决方案,但我一直在遇到性能障碍。

我目前的解决方案是:

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)

对于大约700K记录,需要3分钟,这只是我的生产数据集的一个子集,即2300万条记录。你看到了我的担忧。

我正在尝试这个:

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

但我不能在'系列'上进行低级转换。根据我收到的错误消息。查询工作正常,我可以使用pd.notnull()没有问题,但值的设置是我的问题。

关于如何加快速度的任何想法? 我的源数据正在使用pd.DataFrame.from_records()加载。

我正在使用Pandas 0.16.1,Python 2.7.10

谢谢

1 个答案:

答案 0 :(得分:1)

IIUC你可以使用dt.strftimecolumnname的dtype是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

如果首先需要转换为日期时间并且某些日期已损坏,请使用to_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