工作记录,日拱一卒,头秃算完
1.读取csv文件
工作中会用到读取csv的场景,但是又不想所有的列都读。。所以记录下怎样选择读取
# 这里usecols参数选择要第几列
df_info = pd.read_csv('/data/share/' + ts + '_user_mgmt.csv.gz',usecols=[0, 5, 10, 11], low_memory=False)
# 去掉 unnamed:0 列
df = df.loc[:, ~df.columns.str.contains('Unnamed')]
# 将第一列作为index
data = pd.read_csv('1.csv', index_col=0)
2.pandas处理
pandas处理两个df合并太常见了,但两个df以上join的时候也来记录一下:
多个约束键,多张表做full join 操作如下:
如果想left join 就把主表放在dfs[0]的位置,单个约束键 就把on 改成一个,前提要先把这些df 要连接的字段改成一致。 df1.rename(columns={‘uid’: ‘user_id’}, inplace=True)
# pandas多表合并
from functools import reduce
# 多个约束键,多张表做full join 操作
dfs = [df0, df1, df2, dfN]
df_final = reduce(lambda left,right: pd.merge(left,right,on=['user_id', 'asset'], how='outer'), dfs)
# 完了之后处理空值
df.dropna(axis = 0) # 0 删除行, 1 删除列
df.fillna(0) # 将所有 NaN 值替换为 0
pandas 做聚合操作后,分组的那列会变成索引,导致在做join关联的时候没有这列,处理方法如下:
df = df.groupby(['user_id']).sum()
df['user_id'] = df.index
# python 分组聚合:
group = df.groupby('asset')
df = group.agg({'user_id': 'count', 'balance_coin': 'sum', 'balance_asset': 'sum', 'balance_game': 'sum','coin_amt': 'sum', 'asset_amt': 'sum', 'game_amt': 'sum'})
df.reset_index(drop=True, inplace=True)
# 去重:
df = df.drop_duplicates(['user_id'],keep=False)
# apply 函数:
df['val'] = df.apply(lambda row: my_min(row['val_1'], row['val_2']), axis=1)
# 筛选:
df_info = df_info[('2020-08-20' <= df_info.reg_time) & (df_info.reg_time <= '2020-08-25')]
# pandas将元组('symbol','name_cn')列拆分:
df_withdraw_end['symbol'].apply(pd.Series)
df_withdraw_end[['name_cn', 'symbol']] = df_withdraw_end['symbol'].apply(pd.Series)
# 多列合并成一列:
df['lat_long'] = df[['lat', 'long']].apply(tuple, axis=1)
时间字符串与时间戳的问题
范围时间
有碰到过跑脚本要跑整个时间段范围的,这个时候就遍历res列表取时间就可以了。
import datetime
import time
res = []
def dateRange(beginDate, endDate):
dates = []
dt = datetime.datetime.strptime(beginDate, "%Y-%m-%d")
date = beginDate[:]
while date <= endDate:
dates.append(date)
dt = dt + datetime.timedelta(1)
date = dt.strftime("%Y-%m-%d")
return dates
for date in dateRange('2019-12-14', '2020-07-13'):
res.append(str(date))
# 时间转化时间戳
start_date = time.strftime("%Y-%m-%d")
print(start_date) # 当前时间
datestart = datetime.datetime.strptime(start_date, '%Y-%m-%d') # date格式的时间
datestart -= datetime.timedelta(days=1) # 前一天
# 时间戳
ts = int(time.mktime(datestart.timetuple()))
print(ts)
# 时间戳转化时间字符串
timeArray = time.localtime(1589392800)
otherStyleTime = time.strftime("%Y-%m-%d", timeArray)
print(otherStyleTime)
# 当天零点时间戳
day_time = int(time.mktime(datetime.date.today().timetuple()))
print(day_time)
def firstDayOfMonth(dt):
"""判断今天是不是这个月第一天"""
now_day = (dt + datetime.timedelta(days=-dt.day + 1)).day
return now_day == dt.day