Python 读取csv、pandas多表join、时间与时间戳转换、判断是否当月第一天

工作记录,日拱一卒,头秃算完

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

猜你喜欢

转载自blog.csdn.net/Pioo_/article/details/107468319
今日推荐