2017-02-16 13 views
5

मेरे पास इंडेक्स कॉलम = date के साथ एक पांडा डेटाफ्रेम है।उस महीने की पहली तारीख की तारीख कितनी मंजिल है?

इनपुट:

  value 
date  
1986-01-31 22.93 
1986-02-28 15.46 

मैं मंजिल तक कि महीने के पहले दिन के लिए तारीख चाहते

आउटपुट:

  value 
date  
1986-01-01 22.93 
1986-02-01 15.46 

मैं क्या करने की कोशिश की:

df.index.floor('M') 
ValueError: <MonthEnd> is a non-fixed frequency 

यह संभावित रूप से bec है द्वारा उत्पादित डीएफ उत्पन्न होता है (इस कोड का आउटपुट प्रश्न की शुरुआत में इनपुट है)

मैंने df = df.resample("M", convention='start').sum() भी कोशिश की। हालांकि, यह काम नहीं करता है।

मैं आर में पता है, यह सिर्फ floor(date, 'M') कॉल करने के लिए आसान है।

+0

प्रदर्शन एक मुद्दा है:

datetime मान या तारों के रूप में डेटा के लिए ऊपर काम करता है, आप पहले से ही datetime[ns] प्रकार के रूप में अपने डेटा है तो आप pd.to_datetime() और बस कर छोड़ सकते हैं? मैं मानों को 'डेटाटाइम' ऑब्जेक्ट्स में बदलने के लिए विचार करता हूं, लेकिन यदि आप लाखों ऑब्जेक्ट्स को संसाधित करने की कोशिश कर रहे हैं तो यह महंगा तरीका हो सकता है। – Alfe

उत्तर

4

आप timeseries उपयोग कर सकते हैं MonthBegin

from pandas.tseries.offsets import MonthBegin 
df['date'] = pd.to_datetime(df['date']) + MonthBegin(0) 
+3

यह सब जवाब के बीच में केवल pandonic दृष्टिकोण (एक बोनस इस vectorized है के रूप में) – Jeff

+0

है इस विधि के साथ एक बग है: यह महीने की शुरुआत है, जो रहता है, सिवाय इसके अगले महीने के आरंभ करने के लिए किसी भी तारीख का अनुवाद करता हूँ वही। यानी 1-1-2018 -> 1-1-2018, लेकिन 2-1-2018 -> 1-2-2018 ... –

1
dt_1 = "2016-02-01" 
def first_day(dt): 
    lt_split = dt.split("-") 
    return "-".join([lt_split[0], lt_split[1], "01"]) 

print first_day(dt_1) 

ऑफसेट पांडा का DataFrame के लिए, आप dt["col_name_date"].apply(first_day) उपयोग कर सकते हैं।

1

यह चाल करेगा और कोई आयात आवश्यक नहीं होगा। Numpy एक dtype datetime64 है जो डिफ़ॉल्ट रूप से pandas [ns] पर सेट करता है जैसा कि dtype की जांच करके देखा जाता है। आप इसे महीने में बदल सकते हैं, जो संख्या के सरणी को एक्सेस करके और प्रकार को बदलकर महीने के पहले से शुरू होगा।

df.date = pd.to_datetime(df.date.values.astype('datetime64[M]')) 

यह अच्छा होगा अगर पांडा अपने स्वयं के astype() विधि के साथ यह लागू होता है लेकिन दुर्भाग्य से आप नहीं कर सकते।

df.date = df.date.values.astype('datetime64[M]') 
संबंधित मुद्दे