【发布时间】:2018-11-12 01:10:05
【问题描述】:
我确定这已经被问及回答了,但我太笨了,找不到它。我有一个格式如下的文件:
StationID、年份、JanValue、FebValue、MarValue、AprilValue、...、DecValue
我想将它从每行 12 个月的短胖文件转换为只有 StationID、日期、值、年、月的长瘦文件。
我编写了代码来完成它,它可以工作。它以 pandas 数据帧作为输入并输出一个数据帧。但它很慢,我敢肯定我这样做效率很低。任何帮助将不胜感激。
def long_skinny(df):
# df is a pandas dataframe
# get min and max year from dataframe
min_year = df['year'].min()
max_year = df['year'].max()
# set startdate to Jan. 1st of the first year.
startdate = str(min_year) + "0101"
# final file will have this many periods
num_periods = ((max_year - min_year)+1)*12
# generate a pandas dataframe with a datetime index
dates = pandas.date_range(start=startdate ,periods=num_periods,freq = 'M' )
# set up an empty list
tmps = []
# find years that are in the input dataframe
avail_years = df['year'].tolist()
id_tmp = df['id']
for iyear in range(min_year, max_year+1):
# check to see if year is in the original file
if iyear in avail_years:
year_rec = df[(df['year'] == iyear)]
tmps.append(int(year_rec['tmp1']))
tmps.append(int(year_rec['tmp2']))
tmps.append(int(year_rec['tmp3']))
tmps.append(int(year_rec['tmp4']))
tmps.append(int(year_rec['tmp5']))
tmps.append(int(year_rec['tmp6']))
tmps.append(int(year_rec['tmp7']))
tmps.append(int(year_rec['tmp8']))
tmps.append(int(year_rec['tmp9']))
tmps.append(int(year_rec['tmp10']))
tmps.append(int(year_rec['tmp11']))
tmps.append(int(year_rec['tmp12']))
else:
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps.append(-9999)
tmps_np = np.asarray(tmps, dtype=np.int64)
var_names = ["temp"]
ls_df = pandas.DataFrame(tmps_np, index = dates, columns = var_names)
# add two fields for the year and month
ls_df['year']=ls_df.index.year
ls_df['month']=ls_df.index.month
ls_df['id'] = id_tmp
return(ls_df)
【问题讨论】:
-
谢谢,融化的东西正是我需要的。