爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4723|回复: 8

用python将txt数据中的站点进行拆分

[复制链接]
发表于 2022-3-25 17:02:23 | 显示全部楼层 |阅读模式
Python
系统平台:
问题截图: -
问题概况: 我现在有一些站点的降水资料,格式为txt,想要用python将它们拆分处理,写成以站点号命名的txt
我看过提问的智慧: 看过
自己思考时长(天): 3

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
下面附上txt数据,请各位大佬指点

2010.txt

761.26 KB, 下载次数: 28

密码修改失败请联系微信:mofangbao
发表于 2022-3-25 19:26:47 | 显示全部楼层
import pandas as pd
import os
path = r'C:\Users\ghetto_hu\Desktop\2010'
os.chdir(path)
df = pd.read_csv('2010.txt',header=None,sep='\s+')
print(df.dtypes)
df.columns = ['station','year','month','day','precipitation']
station_list = df['station'].drop_duplicates().to_list()
for order in station_list:
    df_order = df[df['station']==order]
    df_order.to_csv(f'{order}.txt',index=False,header=None,sep = ' ')
密码修改失败请联系微信:mofangbao
回复 支持 2 反对 0

使用道具 举报

发表于 2022-3-25 19:11:56 | 显示全部楼层
1. pandas.DataFrame按照“站号-时间-雨量”格式把文件读出来
2. 筛选不同站点按“时间-雨量”格式写入到对应站点雨量文件
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-29 09:07:09 | 显示全部楼层
帕克和山姆 发表于 2022-3-25 19:26
import pandas as pd
import os
path = r'C:%users\ghetto_hu\Desktop\2010'

谢谢大佬,救人于水火之中
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-4-27 12:52:36 | 显示全部楼层
谢谢大佬们!学习了!
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-5-24 09:00:10 | 显示全部楼层
帕克和山姆 发表于 2022-3-25 19:26
import pandas as pd
import os
path = r'C:%users\ghetto_hu\Desktop\2010'

去重还能这么用,学到了,谢谢大佬
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-5-24 21:29:51 来自手机 | 显示全部楼层
lxy287131416 发表于 2022-05-24 09:00
去重还能这么用,学到了,谢谢大佬


                               
登录/注册后可看大图

                               
登录/注册后可看大图
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-5-25 21:13:48 | 显示全部楼层

请问一下大佬,如果我用groupby把类似楼主的这种资料聚合成以站点为第一元组的数据,下一步怎么分开并分别写入txt呢
代码如下
import pandas as pd
from glob import glob
import numpy as np

files = glob(r'G:\data\data-fengsu\2010*.txt')
def read_data(f):
    return pd.read_csv(f,skiprows=1,delimiter='\s+',usecols = [0,1,2,3,4,5,6,7],
                       na_values = 999998).rename(columns={'Mon':'month'})
from joblib import Parallel,delayed
df = Parallel(n_jobs=-1)(delayed(read_data)(i) for i in files)
df = pd.concat(df)

df.loc[:,'Time'] = pd.to_datetime(df[['Year','month','Day','Hour']])
df = df.set_index(['Time'])

dff = df[['Station_Id_C','Lon','Lat','WIN_D_Avg_2mi']]
dff.loc[:,'WIN_D_Avg_2mi'] = np.where(np.isnan(dff['WIN_D_Avg_2mi']), 0, 1)

group = dff.groupby(by=['Station_Id_C'])      # 将上述代码输入ipython后,会得到一个DataFrameGroupBy对象
df_station = list(dff.groupby(by=['Station_Id_C']))
# 转换成list的形式来看  每个元组中,第一个元素是组别(这里是按照站名进行分组)
# 第二个元素的是对应组别下的DataFrame
# 总结来说,groupby的过程就是将原有的DataFrame按照groupby的字段(这里是站名),
# 划分为若干个分组DataFrame,被分为多少个组就有多少个分组DataFrame。
# 所以说,在groupby之后的一系列操作(如agg、apply等),均是基于子DataFrame的操作。
# 理解了这点,也就基本摸清了Pandas中groupby操作的主要原理。

# 求不同站点缺失数据总数
# dff.groupby(by=['Station_Id_C']).agg('sum')
# 如果想对针对不同的列求不同的值,
# 比如要计算不同Station_Id_C的平均以及中位数,
# 可以利用字典进行聚合操作的指定:
# data.groupby('Station_Id_C'').agg({'x':'median','y':'mean'})
dff.groupby(by=['Station_Id_C']).agg({'WIN_D_Avg_2mi':'sum',})


df_station  输出是这样的

[('52323',
                      Station_Id_C      Lon   Lat  WIN_D_Avg_2mi
  Time                                                         
  2010-03-01 00:00:00        52323  97.0333  41.8              1
  2010-03-01 01:00:00        52323  97.0333  41.8              1
  2010-03-01 02:00:00        52323  97.0333  41.8              1
  2010-03-01 03:00:00        52323  97.0333  41.8              1
  2010-03-01 04:00:00        52323  97.0333  41.8              1
  ...                          ...      ...   ...            ...
  2010-03-31 19:00:00        52323  97.0333  41.8              1
  2010-03-31 20:00:00        52323  97.0333  41.8              1
  2010-03-31 21:00:00        52323  97.0333  41.8              1
  2010-03-31 22:00:00        52323  97.0333  41.8              1
  2010-03-31 23:00:00        52323  97.0333  41.8              1
  
  [744 rows x 4 columns]),
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

发表于 2022-5-30 21:58:00 | 显示全部楼层
lxy287131416 发表于 2022-5-25 21:13
请问一下大佬,如果我用groupby把类似楼主的这种资料聚合成以站点为第一元组的数据,下一步怎么分开并分 ...

你已经提取到list了 接下来就是元组索引到站号
for station in df_station:
    order = station[0]
    df_order = df[df['station'] == order]
    df_order.to_csv(f'{order}.txt',index=False,header=None,sep = ' ')

也可以 df.groupby(by=['station']).groups.keys() 提取站号
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表