我已经从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
我很感激任何帮助(包括我的逻辑和我的代码)。
答案 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), :]