在我的Mongodb数据库中存有400W+数据,其中有一列是日期,我在当初把数据入库的时候没有注意,后面在读取的时候发现它是Int64类型(13位)时间戳的形式,这非常地影响可视化,要转换一下,把它变成字符串。
注意:这里的datetime是我的列名,不是datetime库
df['datetime'] = df.datetime.apply(lambda x: time.strftime("%Y-%m-%d", time.localtime(x / 1000)))
转换后太方便阅读数据了
我有两个数据库,一个是包含股票的【开,收,高,低,成交量,股票名,当天日期】
另一个是包含股票的【股票名,当天日期,流通股本】
现在的需求是将两个合并成一个,即当天日期对应的股票名匹配上流通股本,没有则为空。
这里我们使用pandas的merge方法。
df3 = pd.merge(df1, df2, on=['key1', 'key2'], how='left')
# # 读取的时候把不读取id字段
# df1--->data df2--->financial_data
df1 = pd.DataFrame(list(collection1.find({}, {"_id": 0})))
df1['datetime'] = df1.datetime.apply(lambda x: time.strftime("%Y-%m-%d", time.localtime(x / 1000)))
df2 = pd.DataFrame(list(collection2.find({}, {"_id": 0})))
print('------------开始合并------------------->')
# 合并
df3 = pd.merge(df1, df2, on=['code_name', 'datetime'], how='left')
因为设置了how='left',所以合并的表的数量等于表df1的数量(df1是主表)
如果没看明白合并,可以参考下以下B站up主的讲解
【【科研必备】使用pandas(python)进行数据合并—merge】
从mongodb读取两个表合并后再写入mongodb数据库的完整代码
import pymongo
import pandas as pd
import time
import json
pd.set_option('display.max_rows', None)
start_time = time.time()
# 建立服务器链接
client = pymongo.MongoClient("192.168.2.9", 27017)
print('正在连接数据库-----')
# 读取的数据库对象、插入的数据库对象
db = client['hold_on_security']
# 读取数据集合对象
collection1 = db['data']
collection2 = db['financial_data']
# 插入数据集合对象
insert_coll = db['merge_data']
# # 读取的时候把不读取id字段
# df1--->data df2--->financial_data
df1 = pd.DataFrame(list(collection1.find({}, {"_id": 0})))
df1['datetime'] = df1.datetime.apply(lambda x: time.strftime("%Y-%m-%d", time.localtime(x / 1000)))
df2 = pd.DataFrame(list(collection2.find({}, {"_id": 0})))
print('------------开始合并------------------->')
# 合并
df3 = pd.merge(df1, df2, on=['code_name', 'datetime'], how='left')
# print(df3.info())
df_data = df3[['open', 'close', 'high', 'low', 'volume', 'code_name', 'datetime', 'circulating_cap']]
print('正在合并--------------------------')
# 插入数据集合
data = json.loads(df_data.T.to_json()).values()
print(data)
# 插入数据
result = insert_coll.insert_many(data)
time.sleep(1)
print('执行成功!!')
end_time = time.time()
print('程序运行时间------->', end_time - start_time)