我已经从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
asTrue
和其他所有周末记录(根据新字段)“标记” ,False
并创建另一个包含这些值的列,然后就可以将True
and分组False
。
例如,test1 = bikes['date'] == '7/1/2015'
返回True
所有2015年7月1日值的返回值,但是我无法弄清楚如何遍历其中的所有项,weekends
以便获得True
所有周末的日期。我试过了,打破了Python(再次挂了):
for i in weekends:
for k in df['date']:
test2 = df['date'] == i
我将不胜感激(使用我的逻辑和我的代码)。
首先,创建一个带有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), :]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句