Pandas通过单列中的多个值组合

时间:2015-10-02 19:38:35

标签: python datetime pandas

我已经从205MB csv(大约110万行乘15列)创建了一个pandas数据帧。它包含一个名为starttime的列,它是dtype object(它更确切地说是一个字符串)。格式如下:7/1/2015 00:00:03

我想从这个pandas数据帧中创建两个新的数据帧。一个应包含与周末日期对应的所有行,另一个应包含与工作日日期对应的所有行。

周末日期是:

weekends = ['7/4/2015', '7/5/2015', '7/11/2015', '7/12/2015', 
            '7/18/2015', '7/19/2015', '7/25/2015', '7,26/2015']

我试图将字符串转换为datetime(pd.to_datetime),希望这会使值更容易解析,但是当我这样做时,它会挂起很长时间,以至于我最终重启了几次内核。

然后我决定使用df["date"], df["time"] = zip(*df['starttime'].str.split(' ').tolist())在原始数据框中创建两个新列(一个用于日期,一个用于时间)。接下来我想我会使用布尔测试来标记'周末记录(根据新的date字段)为True,所有其他False并创建另一列保存这些值,然后我就可以按{{1 }和True

例如, False为所有7/1/2015值返回test1 = bikes['date'] == '7/1/2015',但我无法弄清楚如何迭代True中的所有项目,以便weekends适用于所有周末日期。我试过这个并打破了Python(再次挂起):

True

我很感激任何帮助(包括我的逻辑和我的代码)。

1 个答案:

答案 0 :(得分:1)

首先,创建一个包含1.1m行的字符串时间戳的DataFrame:

df = pd.DataFrame({'date': ['7/1/2015 00:00:03', '7/1/2015 00:00:04'] * 550000})

接下来,您可以将它们简单地转换为Pandas时间戳,如下所示:

df['ts'] = pd.to_datetime(df.date)

此操作仅用了不到两分钟。但是,如果指定格式,则花费不到7秒:

df['ts'] = pd.to_datetime(df.date, format='%m/%d/%Y %H:%M:%S')

现在,按照以下方式设置周末标志很简单(大约需要3秒钟):

df['weekend'] = [d.weekday() >= 5 for d in df.ts]

最后,很容易对DataFrame进行子集化,几乎没有时间:

df_weekdays = df.loc[~df.weekend, :]
df_weekends = df.loc[df.weekend, :]

周末标志是帮助解释正在发生的事情。您可以简化如下:

df_weekdays = df.loc[df.ts.apply(lambda ts: ts.weekday() < 5), :]
df_weekends = df.loc[df.ts.apply(lambda ts: ts.weekday() >= 5), :]