从 pandas 日期时间变量中获取日期和月份
Get from pandas datetime variable day and month
我在 pandas 数据框中有 40 年的每日数据,其中包含列 [Index = Date, Data],我想从每个月提取数据,其中天数中包含的数据的累积总和下面代码中显示的顺序,这意味着我必须重复该代码 12 次(即每个月)。
我想知道是否有更有效的编码方式,而无需重复多次相同的代码。
def datos_por_dias(precipitacion):
datos_final = precipitacion
datos_enero1 = np.array([])
datos_enero2 = np.array([])
datos_enero3 = np.array([])
datos_enero4 = np.array([])
comienzo = time.time()
for i in groupsY.year:
datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.day <= 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 16) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 20) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 24) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day <= 2) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 2) & (datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 6) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 6) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 10) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 10) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 14) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 14) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 18) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 22) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 26) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.day <= 30) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 30) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
pE = datos_final.loc[(datos_final.index.month==1)]
return (datos_enero1, datos_enero2, datos_enero3, datos_enero4,
pE)
部分数据如下所示
[Clip of daily data][1]
This is my data
年份数据对应于for循环中的数据即groupsY DataFrame for i in groupsY.year
我想得到如下所示的结果(这是第一个 for 循环,即将月份分成两部分,并对每一部分的数据求和)
Result wanted
感谢您的帮助。
这是一种可以帮助您入门的方法 - 您的函数显示为 return 数据元组,但您粘贴的内容看起来不同,因此您仍然需要按照您需要的确切格式进行操作。
# create mock data
index=pd.DatetimeIndex(start='1/1/1962',end='1/1/1966',freq='D')
data=pd.DataFrame(data={'Datos':np.random.choice(range(11),size=index.shape[0]),'Date':index})
Date Datos
data.head()
0 1962-01-01 7
1 1962-01-02 3
2 1962-01-03 0
3 1962-01-04 7
4 1962-01-05 9
然后我提取关键日期组成部分(年、月、日)-我注意到你在 16 号之前和之后将你的月份分成小块,包括二月,一个较短的月份,所以我只在第 16 天分割月份.
data['day']=data.Date.dt.day
data['year']=data.Date.dt.year
data['month']=data.Date.dt.month
data['DateGroup']=(data.day<17).map({True:'First Half',False:'Second Half'})
那么,你的累计总和看起来只是每半个月组的总和,所以我们用year
、month
和DateGroup
求和得到:
data.groupby(['year','month','DateGroup']).Datos.sum().head(6)
year month DateGroup
1962 1 First Half 83
Second Half 73
2 First Half 100
Second Half 37
3 First Half 81
Second Half 71
我在 pandas 数据框中有 40 年的每日数据,其中包含列 [Index = Date, Data],我想从每个月提取数据,其中天数中包含的数据的累积总和下面代码中显示的顺序,这意味着我必须重复该代码 12 次(即每个月)。
我想知道是否有更有效的编码方式,而无需重复多次相同的代码。
def datos_por_dias(precipitacion):
datos_final = precipitacion
datos_enero1 = np.array([])
datos_enero2 = np.array([])
datos_enero3 = np.array([])
datos_enero4 = np.array([])
comienzo = time.time()
for i in groupsY.year:
datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero1 = np.append([[datos_enero1]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 15) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 15) & (datos_final.index.day <= 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero2 = np.append([[datos_enero2]], [[np.sum(datos_final[(datos_final.index.day > 23) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 16) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 20) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 24) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero3 = np.append([[datos_enero3]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
comienzo = time.time()
for i in groupsY.year:
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day <= 2) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 2) & (datos_final.index.day <= 4) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 4) & (datos_final.index.day <= 6) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 6) & (datos_final.index.day <= 8) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 8) & (datos_final.index.day <= 10) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 10) & (datos_final.index.day <= 12) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 12) & (datos_final.index.day <= 14) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 14) & (datos_final.index.day <= 16) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 18) & (datos_final.index.day <= 20) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 22) & (datos_final.index.day <= 24) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 26) & (datos_final.index.day <= 28) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 28) & (datos_final.index.day <= 30) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
datos_enero4 = np.append([[datos_enero4]], [[np.sum(datos_final[(datos_final.index.day > 30) & (datos_final.index.month==1) & (datos_final.index.year==i)])]])
final = time.time()
print(final - comienzo)
pE = datos_final.loc[(datos_final.index.month==1)]
return (datos_enero1, datos_enero2, datos_enero3, datos_enero4,
pE)
部分数据如下所示
[Clip of daily data][1]
This is my data
年份数据对应于for循环中的数据即groupsY DataFrame for i in groupsY.year
我想得到如下所示的结果(这是第一个 for 循环,即将月份分成两部分,并对每一部分的数据求和)
Result wanted
感谢您的帮助。
这是一种可以帮助您入门的方法 - 您的函数显示为 return 数据元组,但您粘贴的内容看起来不同,因此您仍然需要按照您需要的确切格式进行操作。
# create mock data
index=pd.DatetimeIndex(start='1/1/1962',end='1/1/1966',freq='D')
data=pd.DataFrame(data={'Datos':np.random.choice(range(11),size=index.shape[0]),'Date':index})
Date Datos
data.head()
0 1962-01-01 7
1 1962-01-02 3
2 1962-01-03 0
3 1962-01-04 7
4 1962-01-05 9
然后我提取关键日期组成部分(年、月、日)-我注意到你在 16 号之前和之后将你的月份分成小块,包括二月,一个较短的月份,所以我只在第 16 天分割月份.
data['day']=data.Date.dt.day
data['year']=data.Date.dt.year
data['month']=data.Date.dt.month
data['DateGroup']=(data.day<17).map({True:'First Half',False:'Second Half'})
那么,你的累计总和看起来只是每半个月组的总和,所以我们用year
、month
和DateGroup
求和得到:
data.groupby(['year','month','DateGroup']).Datos.sum().head(6)
year month DateGroup
1962 1 First Half 83
Second Half 73
2 First Half 100
Second Half 37
3 First Half 81
Second Half 71