Python Pandas根据日期条件编写两个不同的文件

时间:2018-02-24 15:31:54

标签: python python-3.x pandas

使用:Python3.6,Pandas 0.22

寻找能引导我朝正确方向前进的任何提示或文档。

我有一个DataFrame,它根据月份和位置计算降雪的平均值。该文件有两年,2016年和2017年。我试图了解我编写的代码是否能够写入两个不同的文件,一个用于2016年,一个用于2017年。

df = pd.read_csv("Data.csv")

df['DATE'] = pd.DatetimeIndex(df['DATE'], format='%M/%D/%Y')

df['Year'] = df['DATE'].dt.year
df['Month'] = df['DATE'].dt.month
df['Day'] = df['DATE'].dt.day

(df
 .assign(MONTH=df['DATE'].dt.strftime('(%m) %B (%y)'))
 .groupby(['NAME', 'MONTH', 'Year'], as_index=False)['SNOW']
 .agg({'AVERAGE': 'mean'})
)

我尝试了许多不同的方法,将DF放在这些循环的内部和外部:

if 'Year' == '2016':
    df = pd.to_csv('average2016.csv', index=False)
else:
    df = pd.to_csv('average2017.csv', index=False)

if df.loc[df['Year'] == 2016]:
   df = pd.to_csv('average2016.csv', index=False)

else:
   df = pd.to_csv('average2017.csv', index=False)

我也尝试过使用pd.Series,但似乎你不能使用df.assign吗?

df = pd.Series(['1/1/2016'])

if df.item():

我也尝试过循环,使用日期范围,但他们只是跳过条件并将所有日期写入一个文件。

2 个答案:

答案 0 :(得分:2)

使用boolean indexing

df1 = df.loc[df['Year'] == 2016]
df1.to_csv('average2016.csv', index=False)

df2 = df.loc[df['Year'] == 2017]
df2.to_csv('average2017.csv', index=False)

对于一般解决方案,请使用groupby

df.groupby('Year').apply(lambda x: x.to_csv('average{}.csv'.format(x.name), index=False))

答案 1 :(得分:0)

以下是一个示例,您可以通过使用dt.year

直接传递日期列来完成此操作
import pandas as pd

df = pd.DataFrame(dict(date=pd.date_range(start="2017-12-28",end="2018-01-04")))

for ind, dfx in df.groupby(df['date'].dt.year):
    dfx.to_csv('average{}.csv'.format(ind), index=False)

数据帧:

        date
0 2017-12-28
1 2017-12-29
2 2017-12-30
3 2017-12-31
4 2018-01-01
5 2018-01-02
6 2018-01-03
7 2018-01-04

成为两个文件,average2017.csvaverage2018.csv

date       date
2017-12-28 2018-01-01
2017-12-29 2018-01-02
2017-12-30 2018-01-03
2017-12-31 2018-01-04