2016-09-26 113 views
0

我有兩個用Pandas模塊在Python中加入的.csv文件。一列是格式爲「dd.mm.yyyy」的日期。在Python/Pandas中定義日期格式

現在我只想從中提取月份(作爲2位數的整數和前導零)以備後用。

我到目前爲止完成了這項工作,但我不得不作弊。 Python認爲我得到的字符串是DAY。我不喜歡半熟的東西,所以我想問問社區我怎樣才能明確地告訴Python哪一部分日期是月份,以便它可以返回給我?

這是我到目前爲止有:

import pandas 

def saison(input): 
    if input == "04" or input == "05" or input == "06" or input == "07" or input == "08" or input == "09": 
     return "Sommer" 
    else: 
     return "Winter" 

df_1 = pandas.read_csv("a.csv", sep=';', names=["DWD_ID", "Datum"], header=0) 
df_2 = pandas.read_csv("b.csv", sep=';', names=[VEG", "DWD_ID"], header=0) 
df_joined = pandas.merge(df_1, df_2, on="DWD_ID") 
df_joined["Datum"] = pandas.to_datetime(df_joined["Datum"]) 

df_joined["Saison"] = saison(df_joined["Datum"].apply(lambda x: x.strftime('%d'))) 

如果我使用

x.strftime('%m') 

而是返回我的一天。

回答

1

你庫侖d提供您想保留在arg中的格式to_datetime

pd.to_datetime(df['date_col'], format="%d.%m.%Y").dt.month.astype(str).str.zfill(2) 
+1

'dayfirst = True'也可以工作,但'format'會更快,當出現問題時會失敗,而不是默默地做出您可能會不同意的選擇。 – Goyo

+1

這樣做的工作!謝謝! – Khaled

+0

@Khaled,我看到你沒有接受任何你以前的問題,包括這個問題的答案;-)如果它解決了你的問題,你應該接受他們(通過點擊複選標記)。這表明今後任何人都會通過這個頁面來解決這個問題。 –

1

首先,它似乎你有交換月份和日期的日期時間,所以你需要添加參數format='%Y-%d-%m'to_datetimePython's strftime directives):

df = pd.DataFrame({'Date': ['2016-24-02']}) 
print (df) 
     Date 
0 2016-24-02 

print (pd.to_datetime(df.Date, format='%Y-%d-%m')) 
0 2016-02-24 
Name: Date, dtype: datetime64[ns] 

轉換,你可以使用後:

dt.strftime

print (df.Date.dt.strftime('%m')) 

解壓縮的另一個解決方案month,然後轉換爲string和最後通過zfill加零填充:

print (df.Date.dt.month.astype(str).str.zfill(2)) 

樣品:

start = pd.to_datetime('2015-02-24') 
rng = pd.date_range(start, periods=10, freq='m') 

df = pd.DataFrame({'Date': rng}) 
print (df) 
     Date 
0 2015-02-28 
1 2015-03-31 
2 2015-04-30 
3 2015-05-31 
4 2015-06-30 
5 2015-07-31 
6 2015-08-31 
7 2015-09-30 
8 2015-10-31 
9 2015-11-30 


print (df.Date.dt.strftime('%m')) 
0 02 
1 03 
2 04 
3 05 
4 06 
5 07 
6 08 
7 09 
8 10 
9 11 
Name: Date, dtype: object 

print (df.Date.dt.month.astype(str).str.zfill(2)) 
0 02 
1 03 
2 04 
3 05 
4 06 
5 07 
6 08 
7 09 
8 10 
9 11 
Name: Date, dtype: object 

最後你可以用條件使用numpy.whereisin

saison = ["04","05","06","07","08","09"] 
df['Saison'] = np.where(df.Date.dt.strftime('%m').isin(saison), 'Sommer','Winter') 
print (df) 
     Date Saison 
0 2015-02-28 Winter 
1 2015-03-31 Winter 
2 2015-04-30 Sommer 
3 2015-05-31 Sommer 
4 2015-06-30 Sommer 
5 2015-07-31 Sommer 
6 2015-08-31 Sommer 
7 2015-09-30 Sommer 
8 2015-10-31 Winter 
9 2015-11-30 Winter 
+0

謝謝!解壓縮月解決方案工作! – Khaled

+0

如果我的或其他答案有幫助,請不要忘記[接受](http://meta.stackexchange.com/a/5235/295067)它。謝謝。您只能接受** ONCE **解決方案。 – jezrael